2017-12-04 5 views
0

私はRazorビューの.NET MVCプロジェクトを持っています。ドロップダウンリスト、テキストボックス、および検索ボタンからなる検索機能を実装したいと思います。ドロップダウンリストをRenderBodyの外に追加する

私の_Layout.cshtmlファイルの外にこの検索スニペットを実装したいと思っています。@RenderBody()コールです。つまり、すべてのページで検索機能にアクセスできるようになります(右上に表示されます)。

私はこれを実装する良い方法を見つけようとしています。私はそれを動作させることができますが、すべてのコントローラとアクションに同じコードを追加する(ドロップダウン値を取得する)必要があります。

ViewBag.States = new SelectList(db.States, "Id", "Name"); 

これを実装する方法はありますか?このようにすることは非常に反復的であると感じます。

答えて

3

ヘッダーに必要な部分ビューを返す子アクションメソッドを用意し、このアクションメソッドをレイアウトで呼び出すことができます。

必要なプロパティのビューモデルを作成します。

public class AllPageVm 
{ 
    public int SelectedItem { set; get; } 
    public List<SelectListItem> Items { set; get; } 
} 

コントローラのいずれかでアクションメソッドを作成します。このアクションの方法をChildActionOnlyデコレータでマークしてください。

public class HomeController : Controller 
{ 
    [ChildActionOnly] 
    public ActionResult HeaderSearch() 
    { 
     var vm = new AllPageVm() 
     { 
      Items = db.States 
         .Select(a => new SelectListItem() {Value = a.Id.ToString(), 
                 Text = a.Name}) 
        .ToList() 
     }; 
     return PartialView(vm); 
    } 

HeaderSearch.cshtml部分ビューでは、検索ヘッダーに必要なマークアップをレンダリングできます。ドロップダウンをレンダリングする簡単な例を次に示します。あなたが(例:テキストボックス、ドロップダウンボタンなどを持つフォームタグ)好きなマークアップ含めるには、この部分を更新することが

があなたのレイアウトで今
@model AllPageVm 
<div> 
    <label>Select one state</label> 
    @Html.DropDownListFor(a => a.SelectedItem, Model.Items, "Select") 
</div> 

、あなたはアクションメソッド

<div class="container body-content"> 
    @Html.Action("HeaderSearch", "Home") 
    @RenderBody() 
    <hr/> 
    <footer> 
     <p>&copy; @DateTime.Now.Year - My ASP.NET Application</p> 
    </footer> 
</div> 
この子を呼び出すことができます

Viewメソッドの代わりにHeaderSearch子アクションメソッドからPartialViewメソッドを呼び出すようにしてください。 Viewメソッドを呼び出すと、再帰的に同じメソッドが呼び出され、StackOverflow例外が発生します。

+0

ありがとうございます!私が気づいていなかった新しい概念をカップルに紹介するための+1。私は私のコンピュータの前に戻ってすぐにこの解決策を試してみるが、一見すると完璧な意味がある。 –

関連する問題