0

ASP.NETMVC3アプリケーションがあります。私は次のものを持っていますViewModel

public class MyViewModel
{
    public string Year { get; set; }
    public string Month {get; set; }

    public IEnumerable<SelectListItem> Years
    {
       get
       {
           return Enumerable.Range(2000, DateTime.Now.Year - 2000).Select(x => new SelectListItem
           {
               Value = x.ToString(),
               Text = x.ToString()
           });
       }
    } 
}

そして次のView

@model MyNamespace.MyViewModel

@Html.DropDownListFor(
        x => x.Year, 
    new SelectList(Model.Years, "Value", "Text"),
    "-- select year --"
)

@Html.DropDownListFor(
        x => x.Month, 
    Enumerable.Empty<SelectListItem>(),
    "-- select month --"
)

DropDownListforからトリガーさMonthれるjQuery関数をforに入力します。これは、完全に機能します。フォームがサーバーに投稿され、ビューがレンダリングされたときに、「Month」DropDownListの値を保持したいのですが、これはで正しく発生します。したがって、私は(jQueryスクリプト以外に)試しました:onchangeDropDownListYearYear

public class MyViewModel
 {
    public string Year { get; set; }
    public string Month {get; set; }

    public IEnumerable<SelectListItem> Months
    {
        get
        {
            if(Year != null)
            {
               return Enumerable.Range(1, 12).Select(x => new SelectListItem
               {
                  Value = x.ToString(),
                  Text = x.ToString()
               });
            }
        }
    }

そして:でView

 @Html.DropDownListFor(
            x => x.Month, 
       new SelectList(Model.Months, "Value", "Text"),
        "-- select month --"
    )

物事を短くするために、コードからYearsを除外しました。が空NullReferenceExceptionであるため、このコードは最初の実行でをスローします。IEnumerableどうすれば目標を達成できますか?

4

1 に答える 1

3

アクションで月リストを再入力する必要があります。POSTはステートレスであり、asp.netWebフォームとは異なります。コードで次のようなことをしてください。

public ViewResult MyAction(MyViewModel model)
{
   if (ModelState.IsValid)
   {
       //.. do your stuff ...
       //return redirect to index if everything went ok
   }

   //something went wrong return the model
   model.Years = new SelectList(/* code to populate years */, "Value", "Text", Model.Year);
   model.Months = new SelectList(/* code to populate months */, "Value", "Text",  Model.Month);
}

補足として、ビューではなくコントローラーでデフォルト値を設定できるため(私の意見ではコントローラーの責任により適しています)、SelectList代わりに使用することを好みます。IEnumerable<SelectListItem>

于 2012-11-30T13:20:13.360 に答える