asp.net mvc partialview

时间:2009-04-20 15:19:31

标签: asp.net-mvc

似乎我对部分观点的使用理解不太恰当。

我正在尝试添加一个从数据库构建的部分视图,并在母版页中使用局部视图。

使用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的方式做到这一点,还是这需要一个聪明的妥协?

6 个答案:

答案 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)

我同意丹尼尔的意见,即使你的控件没有显示在每个页面上,它显示在其中一些页面上,你应该只创建你的主人作为模板