似乎我对部分观点的使用理解不太恰当。
我正在尝试添加一个从数据库构建的部分视图,并在母版页中使用局部视图。
使用NerdDinner项目(非常适合mvc)我添加了以下内容:
观看\共享\ dinners.ascx“:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<NerdDinner.Models.Dinner>>" %>
<ul>
<% foreach (var dinner in Model) { %>
<li>
<a href="/Dinners/Details/<%=dinner.DinnerID %>"><%= Html.Encode(dinner.Title) %></a>
</li>
<% } %>
</ul>
在“Views \ Shared \ Site.Master”中:
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>
...
<% Html.RenderPartial("dinners"); %>
上述内容目前仅在晚餐对象当前可用作列表的页面上起作用(例如,网站/晚餐)。有没有办法以优雅和mvc的方式做到这一点,还是这需要一个聪明的妥协?
答案 0 :(得分:2)
为什么你的主人有它?我会为你的主人添加另一个占位符,然后在有意义的地方添加它。我认为母版页应该与具体细节无关。如果你想要它在所有的晚餐页面上,只需要制作原始的主页。
答案 1 :(得分:2)
这是IMO,ASP.NET MVC的最大限制之一 - 跨多个视图管理共享数据(在将部分ascx视图呈现给字符串之后!)。如果您谷歌搜索或在stackoverflow上搜索“管理共享视图数据asp.net mvc”之类的东西,您将获得大量具有各种选项的结果,其中没有一个是非常完美的。微软的MVC团队已经承认这是一个问题,并希望在未来版本中包含一个标准解决方案。
根据您管理数据访问的方式,最简单的方法可能是创建一个基本Controller类,并在构造函数内部或OnActionExecuting
()内部检索部分所需的数据。
我选择的选项是在MvcContrib项目中使用Html.RenderAction()
帮助器方法。它基本上允许您从视图中调用操作方法并呈现响应。这并不是很好,因为它需要您的视图有更多关于控制器的知识,但它提供了一个简单的短期解决方案,不需要连接任何额外的代码。
答案 2 :(得分:2)
此tutorial on stephan Walther's site处理此问题。如果你使用一个抽象的基类来填充dinners对象并继承它,那么它总是可用的,但是你必须要知道它总是存在,即使你不需要它;)。
答案 3 :(得分:1)
我使用的一种方法是创建一个辅助方法并在主页面中使用它。
public static void RenderDinners(this HtmlHelper helper) { helper.RenderAction<DinnersController>(c => c.Dinners()); }
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %> ... <% Html.RenderDinners(); %>
正如您所见,帮助程序在DinnersController上调用Dinners Action方法。
public ActionResult Dinners() { ...get dinners and put in the View return Dinners(view); }
答案 4 :(得分:0)
答案 5 :(得分:0)
我同意丹尼尔的意见,即使你的控件没有显示在每个页面上,它显示在其中一些页面上,你应该只创建你的主人作为模板