2011-07-09 8 views
0

コントローラである値 "いくつかの値が" 無効asp.netモデルバインディングの検証

public class EditTestViewModel 
{ 
    public String test { get; set; } 

    public EditTestViewModel(String test) 
    { 
     this.test = test; 
    } 
} 

ビュー:私は([保存]をクリック

<% using (Html.BeginForm("EditTest", "Test", FormMethod.Post)) {%> 
    <%= Html.ValidationSummary(true) %> 
    <%= Html.TextBoxFor(model => model.test) %> 
    <%= Html.ValidationMessageFor(model => model.test) %> 
    <input type="submit" value="Save" /> 
<% } %> 

結果データを編集するかどうか):

値 "これはテストですか?" が無効です。

何が起こっているのですか? EditTestViewModelは、パラメータなしのコンストラクタを持っていないためだ

[MissingMethodException: No parameterless constructor defined for this object.] 

は、あなたがこのようにそれを使用することはできません:あなたはこのコードを実行する際に取得し、フォームを送信します

答えて

0

最初の例外は、次のようです。

コードの2番目の問題は、引数として渡されているオブジェクトを再利用するのではなく、POSTアクションで新しいオブジェクトを作成することです。

は、だからここに解決する方法は次のとおりです。

ビューモデル:

public class EditTestViewModel 
{ 
    public String test { get; set; } 
} 

コントローラー:

public ActionResult EditTest() 
{ 
    var model = new EditTestViewModel 
    { 
     test = "Is this a test?" 
    } 
    return View(model); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult EditTest(EditTestViewModel test) 
{ 
    return View(model); 
} 

そして、いくつかの理由で、POSTアクションで値を編集したいと場合は、このビューに反映させるにはモデル状態から削除する必要があります.HTMLヘルパーは古い値を選択します:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult EditTest(EditTestViewModel test) 
{ 
    model.test = "new value"; 
    ModelState.Remove("test"); 
    return View(model); 
} 
+1

はい、最初の点については正しいです。第二のポイント - それは単なるテストであり、意味をなさないと考えられていました。実際のエラーの原因はコントローラのパラメータ名がバインダを混乱させていたクラス変数の名前と同じであることでした。 – BobTurbo

+0

+1あなたは私をキープしていますか?デバッグの一日の後、ネットを検索し、プロジェクトを浄化し、ソリューションはバインダーが混乱しているだけです。バインダーは混乱していますか?それは本当です。だから私の頭脳でこれを燃やす "バインダーは混乱していますバインダーは混乱していますバインダーは混乱しています.... –

+0

少なくともあなたの愚かなバインダーをいくつかのフレンドリーアドバイスを投げます。 –