来自母版页的Html.RenderPartial调用

时间:2008-09-07 21:16:56

标签: asp.net asp.net-mvc master-pages renderpartial html-helper

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

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

7 个答案:

答案 0 :(得分:2)

如何创建一个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);
} 

然后你可以在你的母版页中使用它,比如

<% Html.RenderPartialAction((HomeController x) => x.RenderPartial()) %>

并在您的控制器中使用适当的方法

public PartialViewResult RenderPartial()
{

     return PartialView("~/Path/or/View",_homeService.GetModel())
}

那就是我的2美分

答案 1 :(得分:1)

我有一个similar post并提出了一个对象模型来处理它。

我讨厌非强类型视图,所以采用这种方法并且运行良好。

答案 2 :(得分:1)

我认为你的解决方案可能在于MVC 2.0 RC及其他领域......

Phil Haack在他的博客上发表了一篇文章:http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx

答案 3 :(得分:0)

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

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

我只是从字典中传递数据:ViewData [“articles”]到部分。 (或来自MvcContrib的ViewData.Get())。

您还可以查看MvcContrib中实现的最近实现的SubController模式。

答案 4 :(得分:0)

是的,这是正确的。但让我们来看看这个场景: 在与文章相关的视图上,我有ViewData [“article”],在与页面相关的视图上,我有ViewData [“pages”],但我没有文章和页面都可用。所以,如果我添加:

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

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

到我的母版页,我会在每个页面上抛出异常,其中ViewDataDictionary不包含文章和页面。

至少,这就是我的看法。

答案 5 :(得分:0)

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

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

public class BaseViewModel
{
    public BaseViewModel()
    {
         NavigationItems = RetrieveNavigationItemsFromModel();
    }
    public List<NavItems> NavigationItems {get; set;}
}

在MasterPage和PartialViews中,您可以将Model转换为BaseViewModel并访问NavigationsItems属性。

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

答案 6 :(得分:0)

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

我解决这个问题的方法是使用一个简单的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>

这种方法的一大缺点是客户端必须启用脚本才能工作(所以它真的对SEO不友好)。如果这是你可以忍受的东西,它运作良好。我只在内联网站点上使用它,我知道每个客户端都启用了JavaScript,我不必担心谷歌的机器人。