2

今天在 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();
}

如果参数 toUpdateInfo是“消息”或“消息”(并且只有我所知道的那些)MVC 将无法反序列化对象并且它总是等于null. 但是,如果我们只是更改参数对象的名称,它将包含正确的表单数据:

[HttpPost]
public ActionResult UpdateInfo(UserValidation newUserInfo)
{
     //Code
     if(newUserInfo == null)
     {
         return null;   
     }
      return View(); //Param name != message, this line is hit
}

同样,这只发生在对象等于“消息”或“消息”时。我不知道为什么会这样。

有人有这个理由吗?

4

1 回答 1

3

Message我猜你的UserValidation班级有一个属性。

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

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

我只发现了一些关于这个“功能”的非官方提及:

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

于 2013-09-05T19:54:04.370 回答