如何接收JSON作为MVC 5操作方法参数
我一直在尝试整个下午爬行通过networking试图接收操作控制器中的JSON对象。
什么是正确的或更简单的方法去做呢?
我已经尝试了以下内容:1:
//Post/ Roles/AddUser [HttpPost] public ActionResult AddUser(String model) { if(model != null) { return Json("Success"); }else { return Json("An Error Has occoured"); } }
这给了我一个空值在我的input。
2:
//Post/ Roles/AddUser [HttpPost] public ActionResult AddUser(IDictionary<string, object> model) { if(model != null) { return Json("Success"); }else { return Json("An Error Has occoured"); } }
这给我一个500错误的jQuery的一面是试图张贴到它? (意思是它没有正确绑定)。
这里是我的jQuery代码:
<script> function submitForm() { var usersRoles = new Array; jQuery("#dualSelectRoles2 option").each(function () { usersRoles.push(jQuery(this).val()); }); console.log(usersRoles); jQuery.ajax({ type: "POST", url: "@Url.Action("AddUser")", contentType: "application/json; charset=utf-8", dataType: "json", data: JSON.stringify(usersRoles), success: function (data) { alert(data); }, failure: function (errMsg) { alert(errMsg); } }); }
我想要做的是在我的mvc行动中接收我的JSON对象?
不幸的是Dictionary在MVC中总是遇到模型绑定的问题。 在这里阅读完整的故事 。 所以我们必须创build我们自己的自定义模型绑定器来获取字典作为我们控制器操作的参数。
为了解决您的需求,这里是工作解决scheme –
首先以下面的方式创build你的ViewModel。 PersonModel可以有RoleModel的列表。
public class PersonModel { public List<RoleModel> Roles { get; set; } public string Name { get; set; } } public class RoleModel { public string RoleName { get; set;} public string Description { get; set;} }
然后有一个索引行动,将提供基本的索引视图 –
public ActionResult Index() { return View(); }
索引视图将具有以下JQuery AJAX POST操作 –
<script src="~/Scripts/jquery-1.10.2.min.js"></script> <script> $(function () { $('#click1').click(function (e) { var jsonObject = { "Name" : "Rami", "Roles": [{ "RoleName": "Admin", "Description" : "Admin Role"}, { "RoleName": "User", "Description" : "User Role"}] }; $.ajax({ url: "@Url.Action("AddUser")", type: "POST", data: JSON.stringify(jsonObject), contentType: "application/json; charset=utf-8", dataType: "json", error: function (response) { alert(response.responseText); }, success: function (response) { alert(response); } }); }); }); </script> <input type="button" value="click1" id="click1" />
索引行动职位添加用户行动 –
[HttpPost] public ActionResult AddUser(PersonModel model) { if (model != null) { return Json("Success"); } else { return Json("An Error Has occoured"); } }
所以现在当post发生时,你可以获取所有发布的数据在行动的模型参数。
这里有几个问题。 首先,您需要确保将您的JSON对象绑定回控制器中的模型。 这是通过改变完成的
data: JSON.stringify(usersRoles),
至
data: { model: JSON.stringify(usersRoles) },
其次,你没有正确绑定你的jquery调用types。 如果你删除
contentType: "application/json; charset=utf-8",
它将固有地绑定回一个string。
总之,使用第一个ActionResult方法和下面的jquery ajax调用:
jQuery.ajax({ type: "POST", url: "@Url.Action("AddUser")", dataType: "json", data: { model: JSON.stringify(usersRoles) }, success: function (data) { alert(data); }, failure: function (errMsg) { alert(errMsg); } });
你正在发送一个string数组
var usersRoles = []; jQuery("#dualSelectRoles2 option").each(function () { usersRoles.push(jQuery(this).val()); });
所以相应地改变模型types
public ActionResult AddUser(List<string> model) { }
但是,这并不适用于我,直到我在ajax调用中这样做:
contentType: "application/json; charset=utf-8",
使用Asp.Net MVC 4。