关于asp.net:Html.RenderPartial从母版页调用

关于asp.net:Html.RenderPartial从母版页调用

Html.RenderPartial call from masterpage

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

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


如何创建HtmlHelper扩展方法,该方法允许您在控制器上的action上调用部分视图结果。

就像是

1
2
3
4
5
6
 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);
}

然后您可以在母版页中使用它,例如

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

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

1
2
3
4
5
public PartialViewResult RenderPartial()
{

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

好吧那还是我的2美分


我认为您的解决方案可能属于MVC 2.0 RC以及其他领域。

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


我有一个类似的帖子,并提出了一个对象模型来处理它。

我讨厌这种非强类型的视图,因此采用了这种方法,并且效果很好。


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

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

1
2
3
4
5
6
7
8
9
    <script type="text/javascript">
            $(document).ready(function() {
            $("#applicationForm").load("/Home/ApplicationForm");
            });
   

   

</asp:Content>

这种方法的最大缺点是,客户端必须启用脚本才能正常工作(因此,它对SEO确实不友好)。如果可以的话,您可以忍受它很好地工作。我只在Intranet网站上使用它,因为我知道每个客户端都启用了JavaScript,而我不必担心Google的机器人。


我处理此问题的方法是使用BaseViewModel。所有视图都是根据继承自BaseViewModel的视图模型强类型化的。

BaseViewModel类具有MasterPage所需的所有信息。因此,为了导航,您的BaseViewModel可能看起来像这样:

1
2
3
4
5
6
7
8
public class BaseViewModel
{
    public BaseViewModel()
    {
         NavigationItems = RetrieveNavigationItemsFromModel();
    }
    public List<NavItems> NavigationItems {get; set;}
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
<ul>

<% foreach (NavItem ni in (Model as BaseViewModel).NavigationItems) { %>
   
<li>

       " alt="<%= ni.Alt%>"><%= ni.DisplayText %>
   
</li>

<% } %>

</ul>

是的,这是正确的。但让我们看一下这种情况:
在与文章相关的视图上,我有ViewData [" article"],在与页面相关的视图上,我有ViewData [" pages"],但是我并没有始终都有文章和页面。因此,如果我添加:

Html.RenderPartial(" articlesView",ViewData [" articles]])

Html.RenderPartial(" pagesView",ViewData [" pages"])

在我的母版页上,在ViewDataDictionary既不包含文章也不包含页面的每个页面上都会引发异常。

至少,这就是我的看法。


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

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

我只是将像这样的字典中的数据传递给ViewData [" articles"]。 (或MvcContrib的ViewData.Get())。

您可能还会看看MvcContrib中实现的最近实现的SubController模式。


推荐阅读