2011-09-13 1 views
1

私は非常に単純なモデルで奇妙な問題を抱えていました。コントローラーにポストバックされると、モデルは常にヌルでした。問題を見つけることができないので、モデルを再構築してアクセッサを追加しました。"State"という名前のモデルアクセサは、モデルをnullとしてポストするのはなぜですか?

私は最終的に「国家」と呼ばれる文字列アクセサを持つ、ビューでそれを使用して問題を引き起こしていたことを発見:

<%= Html.HiddenFor(m => m.State) %> 

これはなぜ起こるのでしょうか?ここで

は、モデルである:ここでは

public class StudentSelectState 
{ 
    public string State { get; set; } 
    public int SelectedYear { get; set; } 
    public IDictionary<string, string> Years { get; set; } 
} 

はコントローラです:

[HttpGet] 
    public ActionResult SelectStudent() 
    { 
     var StudentYears = absenceServices.GetStudentYears(); 
     var state = new StudentSelectState {Years = Lists.StudentYearListToDictionary(StudentYears)}; 

     return View(state); 
    } 

    [HttpPost] 
    public ActionResult SelectStudent(StudentSelectState state) 
    { 
     var StudentYears = absenceServices.GetStudentYears(); 

     state.Years = Lists.StudentYearListToDictionary(StudentYears); 

     return View(state); 
    } 

、ここでは図である。

<% using (Html.BeginForm()) 
    {%> 
    <%= Html.ValidationSummary() %> 
     <%= Html.TextBoxFor(m => m.State) %> 
     <%= Html.RadioButtonListFor(m => m.SelectedYear, Model.Years, "StudentYears") %> 
    <div style="clear: both;"> 
     <input value="submit" /> 
    </div> 
<% } %> 

RadioButtonListForは、私が移入するために書いたHtmlHelperのですRadioButtonLists

私はNinject 2.0を使用してコンストラクタにサービスを注入していますが、これはこの問題には関係していないと思います。

アクセサーの名前を変更することはできますが、なぜこれが起こっているのか不思議です。

答えて

2

POSTアクションの引数の名前を変更することもできます。次の要求で送信されたフォームを投稿するとき

[HttpPost] 
public ActionResult SelectStudent(StudentSelectState model) 

State=abcd 

今デフォルトのモデルバインダーは、あなたのaction引数が状態と呼ばれていることを見て、それがabcd値をバインドしようとしますstate変数が文字列ではないため、明らかに失敗します。したがって、ビューモデルのプロパティに名前を付けるときは注意してください。

これらの矛盾を避けるために、私は自分の行動の引数にmodelまたはviewModelという名前を付けることを好みます。

しかし、あなたが何かの名前を変更したくない場合は、別の可能性はそうのように、[BindPrefix]属性を使用することです:私は、ステータスにアクセサの名前を変更し、他のコードには触れていない場合は、

[HttpPost] 
public ActionResult SelectStudent([Bind(Prefix="")]StudentSelectState state) 
0

StudentSelectStateをコントローラにポストバックすると、(IModelBinderを使用していないため)デフォルトのモードバインダでは、いつStudentSelectStateインスタンスを挿入するのかわかりません。

ビューはStateプロパティの状態を保持せず、フォーム内で指定するか、コントローラのアクションに返すために別のメソッドから取得する必要があります。

カスタムIModelBinderクラスを使用して、これに非表示のフィールドを使用することも、バインドすることもできます。

これが役に立ちます。

+0

こんにちはバーニー、 Modelが返されます(radiobuttonlistforヘルパーはラジオボタンリストから選択されたオプションにSelectedYearを設定します)。これが私がこの質問を投稿した理由です。 –

関連する問題