来自主页的Html.RenderPartial调用
这是一个场景:假设我的网站上有两个负责显示不同类型的内容页面和文章的控制器。我需要将"部分视图"嵌入我的母版页,该母版页将列出按某些条件过滤的页面和文章,并显示在每个页面上。我无法在主页上设置模型(对吗?)。如何使用Html.RenderPartial解决此任务?
[编辑]
是的,我可能会为列出文章和页面创建单独的局部视图,但是仍然存在一个障碍,我不能也不应在母版页上设置模型。我需要以某种方式说"这是页面"作为我的renderpartial和文章的参数。 renderpartial与母版页中来自数据库的数据的整个概念对我来说有点模糊。
解决方案
回答
ViewData Model属性仅应用于我们在UI主体部分上正在查看/编辑的内容。
视图的其他部分可能需要ViewData中存在一些数据,因此只需将其添加到字典中即可。
我只是将像这样的字典中的数据传递给ViewData [" articles"]。 (或者MvcContrib的ViewData.Get())。
我们可能还会看看MvcContrib中实现的最近实现的SubController模式。
回答
是的,这是正确的。但让我们看一下这种情况:
在与文章相关的视图上,我有ViewData [" article"],在与页面相关的视图上,我有ViewData [" pages"],但是我并没有始终有文章和页面可用。因此,如果我添加:
Html.RenderPartial(" articlesView",ViewData [" articles]])
Html.RenderPartial(" pagesView",ViewData [" pages"])
在我的母版页上,在ViewDataDictionary既不包含文章也不包含页面的每个页面上都会引发异常。
至少,这就是我的看法。
回答
我有一个类似的帖子,并提出了一个对象模型来处理它。
我讨厌这种非强类型的视图,因此采用了这种方法,并且效果很好。
回答
如何创建HtmlHelper扩展方法,该方法允许我们在控制器上的action上调用部分视图结果。
就像是
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美分
回答
我处理此问题的方法是使用BaseViewModel。所有视图都是根据继承自BaseViewModel的视图模型强类型化的。
BaseViewModel类具有MasterPage所需的所有信息。因此,对于导航,BaseViewModel可能看起来像这样:
public class BaseViewModel { public BaseViewModel() { NavigationItems = RetrieveNavigationItemsFromModel(); } public List<NavItems> NavigationItems {get; set;} }
在MasterPage和PartialViews中,可以将模型转换为BaseViewModel并访问NavigationsItems属性。
<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)在他的博客上发表了一篇文章:http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx
回答
这是一个很晚的回复,但是我在谷歌搜索时转到了此页面,因此其他人也可能也会看到此问题(以及我的回复)。
解决此问题的方法是使用简单的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确实不友好)。如果可以的话,我们可以忍受它很好地工作。我只在Intranet网站上使用它,因为我知道每个客户端都启用了JavaScript,而我不必担心Google的机器人。