我一直在尝试整个下午在网络上爬行,试图在动作控制器中接收JSON对象。
什么是正确的或更简单的方法?
我尝试了以下方法:1:
//Post/ Roles/AddUser [HttpPost] public ActionResult AddUser(String model) { if(model != null) { return Json("Success"); }else { return Json("An Error Has occoured"); } }
这给了我输入一个空值。
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"); } }
这在尝试发布到它的jQuery方面给了我500错误?(这表示未正确绑定)。
这是我的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中存在模型绑定问题。在这里阅读全文。而是创建一个自定义模型联编程序,以将Dictionary作为控制器操作的参数。
为了满足您的要求,这是可行的解决方案-
首先按照以下方式创建ViewModels。PersonModel可以具有RoleModels的列表。
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" />
将操作帖子索引到AddUser操作-
[HttpPost] public ActionResult AddUser(PersonModel model) { if (model != null) { return Json("Success"); } else { return Json("An Error Has occoured"); } }
因此,现在发布时,您可以在action的模型参数中获取所有发布的数据。
更新:
对于asp.net核心,要获取JSON数据作为操作参数,应 [FromBody] 在控制器操作中的参数名称之前添加属性。注意:如果您使用的是ASP.NET Core 2.1,则还可以使用该[ApiController]属性来自动推断复杂操作方法参数的[FromBody]绑定源。(文档)
[FromBody]
[ApiController]