Asp.net 来自母版页的Html.RenderPartial调用

Asp.net 来自母版页的Html.RenderPartial调用,asp.net,asp.net-mvc,master-pages,renderpartial,html-helper,Asp.net,Asp.net Mvc,Master Pages,Renderpartial,Html Helper,下面是一个场景:假设我的站点有两个控制器,负责显示不同类型的内容-页面和文章。我需要将部分视图嵌入到我的母版页中,该母版页将列出使用某些条件筛选的页面和文章,并显示在每个页面上。我不能在主页上设置模型(对吗?)。如何使用Html.RenderPartial解决此任务 [编辑] 是的,我可能会为列出文章和页面创建单独的局部视图,但仍然存在一个障碍,我不能也不应该在母版页上设置模型。我需要以某种方式说“这是页面”,作为我的renderpartial和文章的参数。使用母版页中数据库中的数据呈现部分的整

下面是一个场景:假设我的站点有两个控制器,负责显示不同类型的内容-页面和文章。我需要将部分视图嵌入到我的母版页中,该母版页将列出使用某些条件筛选的页面和文章,并显示在每个页面上。我不能在主页上设置模型(对吗?)。如何使用Html.RenderPartial解决此任务

[编辑]
是的,我可能会为列出文章和页面创建单独的局部视图,但仍然存在一个障碍,我不能也不应该在母版页上设置模型。我需要以某种方式说“这是页面”,作为我的renderpartial和文章的参数。使用母版页中数据库中的数据呈现部分的整个概念对我来说有点模糊。

ViewData Model属性应仅用于在UI的主要部分上查看/编辑的内容

视图的其他部分可能需要ViewData中存在一些数据,因此只需将这些数据添加到字典中即可

我只是将字典中的数据像这样传递:ViewData[“articles”]到partial。(或MvcContrib中的ViewData.Get()


您还可以查看最近在中实现的子客户机模式。

是的,这是正确的。但让我们看看这个场景: 在与文章相关的视图中,我会使用ViewData[“article”],在与页面相关的视图中,我会使用ViewData[“pages”],但我不会一直同时使用文章和页面。因此,如果我补充:

Html.RenderPartial(“articlesView”,ViewData[“articles”])

RenderPartial(“pagesView”,ViewData[“pages”])

对于我的母版页,我将在ViewDataDictionary不同时包含文章和页面的每个页面上引发一个异常

至少,我是这么看的。

我有了一个解决方案,并提出了一个对象模型来处理它


我讨厌非强类型视图,所以采用这种方法,效果很好。

创建一个HtmlHelper扩展方法,允许您在控制器上的操作上调用部分视图结果,怎么样

差不多

 public static void RenderPartialAction<TController>(this HtmlHelper helper, Func<TController, PartialViewResult> actionToRender)
    where TController : Controller, new()
{
    var arg = new TController {ControllerContext = helper.ViewContext.Controller.ControllerContext};
    actionToRender(arg).ExecuteResult(arg.ControllerContext);
} 

不管怎样,这是我的2美分

我处理这个问题的方法是使用BaseViewModel。所有视图都是针对从BaseViewModel继承的视图模型的强类型视图

BaseViewModel类具有母版页所需的所有信息。因此,对于导航,BaseViewModel可能如下所示:

public class BaseViewModel
{
    public BaseViewModel()
    {
         NavigationItems = RetrieveNavigationItemsFromModel();
    }
    public List<NavItems> NavigationItems {get; set;}
}
公共类BaseViewModel
{
公共BaseViewModel()
{
NavigationItems=RetrieveNavigationItemsFromModel();
}
公共列表导航项{get;set;}
}
在母版页和PartialView中,可以将模型强制转换为BaseViewModel并访问NavigationItems属性

<ul>
<% foreach (NavItem ni in (Model as BaseViewModel).NavigationItems) { %>
    <li>
        <a href="<%= ni.Url %>" alt="<%= ni.Alt%>"><%= ni.DisplayText %></a>
    </li>
<% } %>
</ul>

我认为您的解决方案可能位于MVC 2.0 RC和更高版本的土地上


菲尔·哈克(Phil Haack)在他的博客上发表了一篇文章:

这是一个很晚的回复,但我在谷歌搜索时进入了这个页面,所以有可能其他人也会看到这个问题(以及我的回复)

我解决这个问题的方法是使用一个简单的jQuery脚本加载PartialView并执行它的控制器代码。下面是示例

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">

    <script type="text/javascript">
            $(document).ready(function() {
            $("#applicationForm").load("/Home/ApplicationForm");
            });
    </script>

    <div id="applicationForm" />

</asp:Content>

$(文档).ready(函数(){
$(“#applicationForm”).load(“/Home/applicationForm”);
});
这种方法的最大缺点是,客户端必须启用脚本才能工作(因此它对SEO非常不友好)。如果这是你可以接受的东西,那么它很有效。我只在内联网上使用它,我知道每个客户端都启用了JavaScript,我不必担心谷歌的机器人

<ul>
<% foreach (NavItem ni in (Model as BaseViewModel).NavigationItems) { %>
    <li>
        <a href="<%= ni.Url %>" alt="<%= ni.Alt%>"><%= ni.DisplayText %></a>
    </li>
<% } %>
</ul>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">

    <script type="text/javascript">
            $(document).ready(function() {
            $("#applicationForm").load("/Home/ApplicationForm");
            });
    </script>

    <div id="applicationForm" />

</asp:Content>