3

左側にメニューがあり、右側にコンテナがあり、いくつかの部分ビューの1つからレンダリングされる単一のビューがあります。

現在、次の「インデックス」ビューのような状況に陥っています。

<div class="container">  
    <div class="leftHandMenu">  
        // various dynamic menu items  
    </div>  
    <div class="rightHandPane">  
        <% if (Model.CurrentPane == "Sent") { %>  
            <% Html.RenderPartialView("SentPartial", Model.SomeData);  %>  
        <% } else if (Model.CurrentPane == "Inbox") { %>   
            <% Html.RenderPartialView("InboxPartial", Model.SomeData);  %>  
        <% } else if (Model.CurrentPane == "Alerts") { %>  
            <% Html.RenderPartialView("AlertsPartial", Model.SomeData);  %>  
        <% } %>  
    </div>  
       // various other common view items  
</div> 

次のアクションを使用します。

public ActionResult Inbox(int? page)  
{  
    MessageListViewModel viewData = new MessageListViewModel();
    viewData.SomeData = messageService.getInboxMessages(page.HasValue ? page.Value : 0);
    viewData.CurrentPane = "Inbox";
    return View("Index", viewData);
}  

public ActionResult Alerts(int? page)  
{  
   MessageListViewModel viewData = new MessageListViewModel();
    viewData.SomeData = messageService.getAlertMessages(page.HasValue ? page.Value : 0);
    viewData.CurrentPane = "Alerts";
    return View("Index", viewData);
} 

public ActionResult Sent(int? page)  
{  
    MessageListViewModel viewData = new MessageListViewModel();
    viewData.SomeData = messageService.getSentMessages(page.HasValue ? page.Value : 0);
    viewData.CurrentPane = "Sent";
    return View("Index", viewData);
}  

この状況が理想的ではないことは理解していますが、これらの部分を部分的なビューのままにしておく必要があります。このビューで一連の ajax 呼び出しを行って、その「rightHandPane」をさまざまな部分ビューでリロードしています。

単一のビュー「インデックス」と、「インデックス」の特定のペインをロードするこれらのさまざまな部分ビューがあります。ビュー名を ViewModel に渡し、これらの if-else ステートメントを適切な部分ビューにロードします。

他にどうすればこれを行うことができますか?さらに 3 つの部分ビューを追加しようとしていますが、これが面倒になり始めています。ViewModel で currentPane を維持する必要がまったくない方がいいと思います。

この状況を一緒に回避するために私にできることはありますか? 共通部分にマスター ビューを使用することを検討しましたが、厳密に型指定されたマスター ビューである必要があり、ASP.NET MVC では簡単ではありません。

ありがとう!

4

4 に答える 4

2

アクションごとに個別のビューを使用し、マスター ページですべての共通部分を管理してみませんか?

各セクションのプレース ホルダーを含むマスター ページを作成できます。

<div class="container">  
    <div class="leftHandMenu">  
        <asp:ContentPlaceHolder ID="LeftHandMenuContainer" runat="server" />
    </div>  
    <div class="rightHandPane">  
         <asp:ContentPlaceHolder ID="RightHandPaneContainer" runat="server" />
    </div>  
      <asp:ContentPlaceHolder ID="FooterContainer" runat="server" />  
</div>

次に、各コンテンツ ページにビュー固有のコンテンツを配置します。

于 2009-12-22T19:26:20.250 に答える
1

あなたは単に書くことができます:

Html.RenderPartialView(string.Format("{0}Partial", Model.CurrentPane), Model.SomeData);  %> 

ただし、部分ビュー全体の名前を渡すことをお勧めします。私の$.02。

于 2009-12-22T21:12:50.693 に答える
0

あなたはどちらかできます

a) (ASP.NET 4 を使用している、または使用する予定の場合)代わりにHtml.Action()orの呼び出しを追加しHtml.RenderAction()、コントローラー アクションにレンダリングするパーシャルを決定させます。

b) if ステートメントを別のパーシャル メソッドまたはヘルパー メソッドに分解します。例えば:

public static void RenderRightHandPane(this HtmlHelper helper, YourViewModelType model)
{
    switch(model.CurrentPane.ToLower())
    {
        case "sent":
            helper.RenderPartialView("SentPartial", model.SomeData);
        case "inbox":
            helper.RenderPartialView("InboxPartial", model.SomeData);
        case "alerts": 
            helper.RenderPartialView("AlertsPartial", Model.SomeData);
        case default:
            // Add a default handler - perhaps rendering a not found-view...?
    }
}

それは次のように呼ばれます:

<% Html.RenderRightHandPane(Model); %>
于 2009-12-22T18:06:31.083 に答える
0

「規則に従ってコーディング」し、次のパターンに従うことができます。

<div class="rightHandPane">  
    <% Html.RenderPartialView(Model.CurrentPane + "Partial", Model.SomeData);  %>  
</div>  
于 2009-12-24T14:37:02.867 に答える