2012-03-03 4 views
0

内のすべてのアクションには自動的に...私は、コントローラでこれをやってみたかったコントローラ

 protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     (filterContext.Result as ViewResultBase).Model = BindViewModel(); 

     base.OnActionExecuted(filterContext); 
    } 

をビューモデルを割り当てる....しかし、モデルにはセッターを持っていません。

私の考えは、完全なリダイレクトを行うと、最初のリクエストかポストバックかをドロップダウンリストに追加するために同じデータセットを必要とするということです。だから私はドロップダウンリストのデータをバインドするコードを繰り返すしたくない。

アイデア?私はWebFormsで使用したパターンを再作成しようとしています。PreRenderまでバインディングコードを残しておくページをリストアップしています。そのため、ページライフサイクルの早い段階で何が行われたとしても、ページ。

+0

戻るビュー( "MyView"、BindViewModel())を使用したくないのはなぜですか? –

+0

ポストリクエストでは、ModelStateは状態を保持しているため、再度ドロップダウンを設定する必要はありません(モデルステートをクリアしていない場合)。しかし、リダイレクト後にドロップダウンを保持したいかのようですか? – Manas

+0

@EvgenyLevinこれは私が今やっていることですが、コードの重複です。 –

答えて

0

私は

[HttpGet] 
    public ActionResult Index() 
    { 
     TestModel model = new TestModel(); 
     model.Items = new List<string> { "A", "B" }; 

     return View(model); 
    } 
    [HttpPost] 
    public ActionResult Index(TestModel model) 
    { 
     return View(model); 
    } 

public class TestModel 
{ 
    public string SelectedItem { get; set; } 

    public IEnumerable<SelectListItem> DropdownItems 
    { 
     get 
     { 
      if (Items == null) 
       return null; 
      return Items.Select(i => new SelectListItem { Text = i, Value = i }); 
     } 
    } 

    public IEnumerable<string> Items { get; set; } 
} 

とコントローラでは、などのモデルを定義できます(小規模な説明が続く)の例で、あなたの質問に答えることをしようとします今、ビューでは、

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
    <legend>TestModel</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.SelectedItem) 
    </div> 
    <div class="editor-field"> 
    @for (int i = 0; i < Model.Items.Count(); i++) 
    { 
     @Html.Hidden("Items["+i+"]",Model.Items.ElementAt(i)) 
    } 
     @Html.DropDownListFor(m=>m.SelectedItem,Model.DropdownItems) 
     @Html.ValidationMessageFor(model => model.SelectedItem) 
    </div> 

    <p> 
     <input type="submit" value="Create" /> 
    </p> 
    </fieldset> 
} 

説明:

モデルには、ドロップダウンアイテムのプロパティであるIEnumerable Itemsのプロパティがあります。ビューではアイテムの非表示フィールドを設定することができます。そのため、各投稿要求にデータが設定されます。再度設定する必要はありません。

+0

これはWebFormsのビューステートに似ています。私にそれを行う方法を示す時間をとってくれてありがとうが、それは少しポイントを得ることはそれではないですか? View( "MyView"、BindViewModel()) 'を2回書くのを避けるために、すべてのコードとより大きなWebリクエスト! –

+0

はい、HTTPはステートレスなので、各要求はその状態を定義する必要があります。 – Manas

関連する問題