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

へのパラメーターUpdateInfoが「メッセージ」または「メッセージ」(および私が知っているもののみ) の場合、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 に答える