最近我们将我们的应用程序从 MVC3 更新到了 MVC4。在 MVC4 中,我们发现在 ViewModel 中使用Studio
和之类的属性名称StudioExecutive
会导致发布时出现问题。在控制器方法中,我们总是会得到Studio = null
何时StudioExecutive
被填充。
这是我们问题的一个例子,希望有这个问题的答案。
数据类:
public class TestContact
{
public List<TestContactItem> Studio { get; set; }
public List<TestContactItem> StudioExecutive { get; set; }
public TestContact()
{
Studio = new List<TestContactItem>();
StudioExecutive = new List<TestContactItem>();
}
}
public class TestContactItem
{
public int Id { get; set; }
public string Name { get; set; }
}
控制器方法:
public ActionResult TestContactView()
{
var vm = new TestContact();
vm.Studio.Add(new TestContactItem(){Id=1, Name = "Studio Contact ID=1"});
vm.StudioExecutive.Add(new TestContactItem() { Id = 2, Name = "Studio Exec Contact ID=2" });
return View(vm);
}
[HttpPost]
public ActionResult SaveTestContact(TestContact model)
{
return Content("success");
}
使用 Ajax POST 查看 / JavaScript:
@using System.Web.Script.Serialization
@model TestContact
<button type="button" onclick="SaveTestContact();">Click Here to Post</button>
<script type="text/javascript">
$(document).ready(function() {
globalTestModel = @Html.Raw(new JavaScriptSerializer().Serialize(Model));
});
function SaveTestContact() {
// passing additional studio & studio executive parameter to controller because it was not mapping correctly to the server side viewmodel without it
$.ajax({
type: "POST",
url: "/Test/SaveTestContact",
data: JSON.stringify(globalTestModel),
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function (msg) {
}
});
}
</script>
在这个例子中,我们用至少一Studio
和一填充我们的对象StudioExecutive
并渲染视图。单击视图中的按钮时,我们将相同的对象发布到控制器方法,但 ViewModel 未正确绑定,该Studio
属性设置为 null。
*不幸的是,我无法发布图像我有一个对象的屏幕截图,显示Studio
计数为 0,StudioExecutive
计数为 1
我们确实在 POST 之前放置了一个断点,以确保 JavaScript 上的序列化是正确的并且对象已被填充。
我们得出的结论是,这与 2 个属性的命名约定有关,其中一个是另一个的子字符串。任何遇到同样问题的人都可以为我们指明正确的方向。