如何使用json将复杂类型传递给ASP.NET MVC控制器
我有一个视图,允许用户输入/编辑新小部件的数据。我希望将该数据形成一个json对象,并通过AJAX将其发送给我的控制器,这样我就可以在服务器上进行验证,而无需回发 我已经完成了所有工作,只是我不知道如何传递数据,这样我的控制器方法就可以接受复杂的小部件类型,而不是每个属性的单独参数 如果这是我的目标:如何使用json将复杂类型传递给ASP.NET MVC控制器,asp.net,jquery,asp.net-mvc,json,Asp.net,Jquery,Asp.net Mvc,Json,我有一个视图,允许用户输入/编辑新小部件的数据。我希望将该数据形成一个json对象,并通过AJAX将其发送给我的控制器,这样我就可以在服务器上进行验证,而无需回发 我已经完成了所有工作,只是我不知道如何传递数据,这样我的控制器方法就可以接受复杂的小部件类型,而不是每个属性的单独参数 如果这是我的目标: public class Widget { public int Id { get; set; } public string Name { get; set; } public
public class Widget
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
我希望我的控制器方法如下所示:
public JsonResult Save(Widget widget)
{
...
}
var formData = $("#Form1").serializeArray();
$.post("/Widget/Save",
formData,
function(result){}, "json");
目前,我的jQuery如下所示:
public JsonResult Save(Widget widget)
{
...
}
var formData = $("#Form1").serializeArray();
$.post("/Widget/Save",
formData,
function(result){}, "json");
我的表单(Form1)为小部件上的每个属性(Id、名称、价格)都有一个输入字段。这非常有效,但它最终会将小部件的每个属性作为单独的参数传递给我的控制器方法
是否有一种方法可以“截取”数据,可能使用ActionFilterAttribute,并在调用我的控制器方法之前将其反序列化为小部件对象?您要做的是以与后端对象相同的方式构造javascript表单对象:
{ Id : "id", Name : "name", Price : 1.0 }
然后使用toJSON插件将其转换为上述字符串。您可以将此字符串发送到后端,并使用类似JayRock库的方法将其转换为新的小部件对象。提供了有关模型绑定的信息,可能会有所帮助。这并不是您在这里所说的100%,但我认为这可能会让您更好地全面了解DefaultModelBinder。谢谢Jeff,这让我走上了正确的道路。DefaultModelBinder足够聪明,可以为我发挥所有的魔力……我的问题在于我的小部件类型。在我匆忙中,我的类型被定义为:
public class Widget
{
public int Id;
public string Name;
public decimal Price;
}
请注意,该类型具有公共字段而不是公共属性。一旦我把它们改成属性,它就起作用了。以下是正确运行的最终源代码:
Widget.aspx:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Widget.aspx.cs" Inherits="MvcAjaxApp2.Views.Home.Widget" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<script src="../../Scripts/jquery-1.2.6.js" type="text/javascript"></script>
<script type="text/javascript">
function SaveWidget()
{
var formData = $("#Form1").serializeArray();
$.post("/Home/SaveWidget",
formData,
function(data){
alert(data.Result);
}, "json");
}
</script>
<form id="Form1">
<input type="hidden" name="widget.Id" value="1" />
<input type="text" name="widget.Name" value="my widget" />
<input type="text" name="widget.Price" value="5.43" />
<input type="button" value="Save" onclick="SaveWidget()" />
</form>
</asp:Content>
请注意(在MrDustpan的解决方案中),MVC操作方法中的参数名称小部件必须与ASPX文件中名称属性中使用的前缀匹配
如果不是这种情况,则Action方法将始终接收一个null对象
<input type="text" name="widget.Text" value="Hello" /> - OK
<input type="text" name="mywidget.Text" value="Hello" /> - FAILS
-好的
-失败
太棒了,很高兴你修好了。谢谢你发布你是如何修复它的,这将在将来对其他人有很大帮助!公共字段是.NET中的魔鬼卵。他们破坏了一切。我告诉你的一切@MrBoJangles-字段是问题所在,解决方法是将它们更改为属性。我在我的项目中使用了这种格式。它从未在$.post()
中运行回调函数,我只是在其中添加了一个通用的警报(“成功”)代码>,不知道为什么没有,但它确实发布了我的数据,这让我很高兴,所以+1。我不知道为什么我的简单的$('#Form1').submit()
不起作用,当我在操作中有method=post
和我的控制器/更新时。实际上,我发现如果我在回调结束时去掉,“json”
,警报就会起作用。供其他人参考。要点很好,容易被忽略。似乎也区分大小写。