3

ASP.NET MVCで、すべてのコントローラーで部分ビューを使用できるようにするにはどうすればよいですか?サイト全体に共通のナビゲーションを作成したいのですが、Html.Actionをマスターページに配置すると、1つのコントローラーに関連付けられたビューでのみ機能します。

現在、次のように定義されたコントローラーアクションがあります。

    // GET: GetCategoriesPartial
    [ChildActionOnly]
    public ActionResult GetCategoriesPartial()
    {
        var category = CategoriesDataContext.GetCategories();
        return PartialView(category);
    }

そして、私はこのような部分的なビューを作成しました:

<%@ Import Namespace="wopr.Models" %>
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>

<ul>
<%
    foreach (var cat in Model as IEnumerable<Category>) {
        %>
        <li><a href="/categories/Details/<%=cat.catID%>"><%=cat.catName%></a></li>
        <%
    }

%>
</ul>

私のマスターページは次のようになります。

<%@ Import Namespace="wopr.Models" %>
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
    <link type="text/css" rel="Stylesheet" href="/Content/Site.css" />
</head>
<body>
    <div class="wrap-all">
    <div style="text-align:right;">
        <a href="/">Home</a> | 
        <a href="/games/">Games</a> | 
        <a href="/games/Index2/1">Games <em>(paginated)</em></a> | 
        <a href="/categories/">Categories</a> | 
        <a href="/upload/">Upload</a>
    </div>
        <asp:ContentPlaceHolder ID="MainContent" runat="server">

        </asp:ContentPlaceHolder>


        <!--This errors on any non-CategoryController page.-->
            <%= Html.Action("GetCategoriesPartial")%>
        <!---->

    </div>
</body>
</html>

このコードは、CategoriesControllerによって処理されるものを表示している限り機能します。別のコントローラーによって処理されるビューに移動すると、例外が発生します。

System.Web.HttpException:パブリックアクションメソッド'GetCategoriesPartial'がコントローラー'wopr.Controllers.GamesController'で見つかりませんでした。

この部分ビューをサイトのすべてのコントローラーで使用できるようにするにはどうすればよいですか?

助けてくれてありがとう。Quakkels

4

3 に答える 3

3

views\sharedフォルダに入れます

ただし、エラーメッセージを見ると、別のことが起こっているようです。<%=Html.Action%>ビューのレンダリングには使用できません。あなたは使用する必要があります<%=Html.RenderPartial("ViewName")%>

于 2010-05-07T19:27:27.620 に答える
2

MVC2を使用すると、ビューでアクションを直接レンダリングできるようになりました。同じコントローラーからレンダリングされていない場合は、アクションがオンになっているコントローラーを指定する必要があります。この方法で含めると、部分ビューを(共有ではなく)コントローラーのビューフォルダーに配置できます。現在のアクションからViewDataを取得するのではなく、呼び出しているアクションによって設定されたものだけを取得することに注意してください。

<% Html.RenderAction( "GetCategoriesPartial", "Category" ) %>

また

<%= Html.Action( "GetCategoriesPartial", "Category" ) %>
于 2010-05-07T19:34:49.013 に答える
1

ropstahの応答に追加するために、asp.net-mvcの規則では、コントローラーは最初にそれ自体と同じ名前(コントローラービットを除く)のフォルダーを検索し、次に共有フォルダーの下でビューを検索します。見つかりません。

于 2010-05-07T19:29:34.647 に答える