名为“消息/消息”的MVC 4“Bug”参数对象不会被反序列化

时间:2013-09-05 19:32:50

标签: c# asp.net-mvc asp.net-mvc-4

今天在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”时发生。我不知道为什么会这样。

有没有人有理由这样做?

1 个答案:

答案 0 :(得分:3)

我猜您的Message课程中有一个名为UserValidation的媒体资源。

这会混淆模型绑定器,因为它首先尝试将发布的值与参数名称进行匹配,然后才会移动以匹配复杂参数类型的属性。

在您的情况下,它会在您发布的数据中看到Message键,因此它会尝试匹配您的整个UserValidation message参数,该参数将失败,因此整个绑定过程将停止,您将获得null

我只是发现了一些非正式的提及这个“功能”:

所以只需使用不同的参数名称,它就能正常工作。