我正试图找出MVC3中的模型绑定。看看这个例子。
这是控制器代码:
public ActionResult Index()
{
Person person = new Person{ Name = "Test" };
return View(person);
}
[HttpPost]
public string Edit(Person personModel)
{
return string.Format("From server: {0}", personModel.Name);
}
这是html / javascript位:
@model MCV3.Test.Models.Person
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
$(document).ready(function (){
var model = @Html.Raw(Json.Encode(Model));
$.ajax({
url : "/Person/Edit",
type: "Post",
datatype: "json",
data : model,
success: function (data) {
$("#result").text(data);
}
});
});
</script>
</head>
<body>
<label id="result"></label>
</body>
</html>
上面的代码有效,但如果我将ajax调用的数据设置更改为:
$.ajax({
url : "/Person/Edit",
type: "Post",
datatype: "json",
data : {personModel : model},
success: function (data) {
$("#result").text(data);
}
});
它不再起作用:模型的类型正确,但name属性为null。
在有效的示例中,post参数为:
Name Test
Name=Test
但是在不起作用的例子中,它们是:
personModel[Name] Test
personModel%5BName%5D=Test
似乎MVC无法序列化请求,如果它看起来像这样:personModel[Name] Test
如果不编写自定义活页夹,有没有办法解决这个问题?
答案 0 :(得分:1)
当MVC绑定尝试创建并填充Person
对象以传递给您的Edit
操作时,它会尝试查找Person
对象上所有可设置属性的值;在这种情况下是Name
属性。因此,它查找表单数据,查询字符串数据(等)以获取具有键“名称”的名称值对。你的工作实例有一个,你的非工作实例没有。
如果您想以这种格式发布数据,您可以创建一个自定义ValueProvider
来解析数据并根据它找到的内容返回值。