今天在MVC中遇到一个非常奇怪的错误。我不想发布我的所有代码,但我会发布一个小例子。
假设我有一个带有表单的cshtml页面:
@model UserValidation
<!-- Code before body -->
@using (Html.BeginForm("UpdateUser", "Account"))
{
<div class="Label">@Html.LabelFor(m => m.Name):</div>
<div>@Html.TextBoxFor(x => x.Name)</div>
<div style="clear: both;">
@Html.ValidationMessageFor(x => x.Name)
<div class="Label">@Html.LabelFor(x => x.OldPass):</div>
<div>@Html.PasswordFor(x => x.OldPass)</div>
<div style="clear: both;">
@Html.ValidationMessageFor(x => x.OldPass)
<!-- More Form Code Here, You get the idea -->
<input type="submit" value="Submit" />
}
与验证类一起(我不确定这是否是问题的一部分)
public class UserValidation
{
[Display(Name = "User Name")]
public string Name { get; set; }
[Display(Name = "Current password")]
public string OldPass { get; set; }
//More code here
}
最后,控制器中的HTTPPOST:
[HttpPost]
public ActionResult UpdateInfo(UserValidation message)
{
//Code
if(message == null)
{
return null; //If param name == message this line is hit
}
return View();
}
如果UpdateInfo
的参数是“message”或“Message”(并且只有我所知道的那些)MVC将无法反序列化该对象,它将始终等于null
。但是,如果我们只是更改参数对象的名称,它将包含正确的表单数据:
[HttpPost]
public ActionResult UpdateInfo(UserValidation newUserInfo)
{
//Code
if(newUserInfo == null)
{
return null;
}
return View(); //Param name != message, this line is hit
}
同样,这仅在对象等于“message”或“Message”时发生。我不知道为什么会这样。
有没有人有理由这样做?
答案 0 :(得分:3)
我猜您的Message
课程中有一个名为UserValidation
的媒体资源。
这会混淆模型绑定器,因为它首先尝试将发布的值与参数名称进行匹配,然后才会移动以匹配复杂参数类型的属性。
在您的情况下,它会在您发布的数据中看到Message
键,因此它会尝试匹配您的整个UserValidation message
参数,该参数将失败,因此整个绑定过程将停止,您将获得null
我只是发现了一些非正式的提及这个“功能”:
所以只需使用不同的参数名称,它就能正常工作。