我正在尝试使用以下方法使用jQuery Ajax将数据发布到MVC操作.但是在控制器内部,所有模型属性始终为null.不知道我在这里缺少什么.
.CSHTML
<form id="MyForm">
<input name="PersonName" type="text" />
<input name="Address" type="text" />
<select name="States" multiple="multiple">
<option value="TX">Texas</option>
<option value="OK">Oklahoma</option>
<option value="OH">Ohio</option>
</select>
<select name="Status">
<option value="1">Active</option>
<option value="2">Deleted</option>
<option value="3">Pending</option>
</select>
<input type="button" value="Save" id="Save" />
JavaScript的
$(function () {
$("#Save").click(function (e) {
var dataToPost = $("#MyForm").serialize()
$.ajax(
{
type: "POST",
data: JSON.stringify(dataToPost),
url: "Working/Save",
contentType: 'application/json; charset=utf-8'
})
})
})
调节器
public class WorkingController : Controller
{
// GET: Working
public ActionResult Index()
{
return View();
}
public ActionResult Save(WorkingModel model)
{
// All model properties are null here????
return Json("Success");
}
}
模型
public class WorkingModel
{
public string PersonName { get; set; }
public string Address { get; set; }
public string[] States { get; set; }
public string Status { get; set; }
}
EDIT1
我已经添加了上面的模型.这里,当我点击保存时,序列化数据和JSON字符串化数据.
序列化数据
"PersonName=Foo&Address=123+Test+Drive&States=TX&Status=1"
在JSON.Stringify之后
"\"PersonName=Foo&Address=123+Test+Drive&States=TX&Status=1\""
我试过添加HttpPost属性和[FromBody]属性没有运气.
我认为我不必将ActionResult的返回类型更改为JsonResult.
此外,URL也是正确的,因为调试器正在我可以QuickWatch模型属性的action方法中.
请注意,如果我创建JSON对象并将其发布如下,则它可以工作:
var dataToPost = {
PersonName:'Foo',
Address: '123 Test Drive',
State: 'TX',
Status: 1
}
解决方法:
您的JavaScript / jQuery代码可以大大简化,这可能是最佳选择:
$(function () {
$("#MyForm").on('submit', function (e) {
e.preventDefault() // prevent the form's normal submission
var dataToPost = $(this).serialize()
$.post("Working/Save", dataToPost)
.done(function(response, status, jqxhr){
// this is the "success" callback
})
.fail(function(jqxhr, status, error){
// this is the ""error"" callback
})
})
})
您应该处理表单的onsubmit事件,而不是按钮的onclick事件 – 除按钮之外的其他内容可能会导致提交表单.在这种情况下,我们希望阻止表单的默认提交行为,因为我们使用AJAX提交表单.
.serialize()已经正确处理了对表单的编码,因此您不需要对表单值进行JSON编码.这样做很可能是模型绑定器在处理请求时没有重建模型的原因.
$.post是一个辅助函数,它包含了$.ajax所需的常用设置工作 – 此处显示的版本需要URL发送到POST,数据发送到POST.如果您的jQuery代码位于View中的脚本元素中,那么您可能希望使用Url.Action()帮助程序 – 它将根据您的路由规则构建正确的URL.如果你选择走这条路,你会使用类似的东西:
$.post('@Url.Action("Save", "Working")', dataToPost)
然后,我们使用相关的帮助程序处理成功的响应(任何具有HTTP-200状态代码的响应)和失败的响应(基本上是其他任何东西).你在那些助手中所做的事取决于你.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。