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; }
}
编辑1
我已经添加了上面的模型。这是当我点击保存时序列化数据和JSON stringify
数据的内容。
序列化数据
"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
模型属性。
请注意,如果我创建JSON对象并像下面这样发布它,则可以正常工作:
var dataToPost = {
PersonName:'Foo',
Address: '123 Test Drive',
State: 'TX',
Status: 1
}
WorkingModel
并指出您在浏览器控制台中遇到的错误(我假设是由于不正确的URL而导致的404错误)。 - user3559349contentType: 'application/json; charset=utf-8'
并使用data: dataToPost
。您还应该使用url: '@Url.Action("Save", "Working")'
确保您的URL相对于页面正确生成。 - user3559349@Url.Action("Save", "Working")
不是必需的,只要像OP一样使用正确的路径就可以了。然而,在大多数情况下,出于各种原因,使用@Url.Action("Save", "Working")
是正确的方法。我只想提到两点:1)解耦物理路径和代码,2)集中路径生成。 - Racil Hilan@Url.Action()
。 OP当前的url是Working/Save
,但根据当前页面可能需要为/Working/Save
。Url.Action()
将始终生成正确的url。 - user3559349