在哪里放置视图逻辑?

时间:2011-01-18 08:59:57

标签: .net asp.net-mvc views partial

我对ASP.NET MVC的设计模式有点困惑。我有一个主页,包括呈现面包屑的部分视图:

<div id="header">
    <strong class="logo"><a href="#">Home</a></strong>
    <% Html.RenderPartial("BreadCrumbs"); %>

问题是,我希望breadcrumb链接在生产环境和开发环境中都能正常工作。所以我在局部视图中的代码是这样的:

<p id="breadcrumbs">
    You are here: <a href="http://
    <% if (Request.Url.IsLoopback)
           Response.Write(String.Format("{0}/{1}", Request.Url.Host, Request.Url.Segments[1]));
       else
           Response.Write("http://mysite.com/");

...

这违反了保持观点“愚蠢”的原则吗?我从网页中提取这个的部分原因是这个原则。似乎我刚刚将问题转移到了新视图?有什么替代方案?

2 个答案:

答案 0 :(得分:7)

不确定您使用的MVC版本。如果您使用的是MVC3,则可以创建一个GlobalActionFilter:http://weblogs.asp.net/gunnarpeipman/archive/2010/08/15/asp-net-mvc-3-global-action-filters.aspx

public class ViewBagInjectionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnResultExecuting(filterContext);

        filterContext.Controller.ViewBag.SiteUrl = filterContext.HttpContext.Request.Url.IsLoopback
                                                       ? String.Format("{0}/{1}",
                                                                       filterContext.HttpContext.Request.Url.Host,
                                                                       filterContext.HttpContext.Request.Url.
                                                                           Segments[1])
                                                       : "http://mysite.com/";

    }
}

然后,此过滤器可以在ViewBag(动态对象)中添加一个属性,称为SiteUrl,您可以在其中根据您所处的状态设置站点URL。

在PartialView中,您将不再需要if语句,只需致电:ViewBag.SiteUrl。此外,任何其他页面都可以访问SiteUrl属性。

答案 1 :(得分:0)

您可以将面包屑的生成放在子操作中。这将为您提供全新的视图和控制器

在主页:

 <%: Html.Action("Crumbs", "Master") %>

MasterController:

 [ChildActionOnly]
 public PartialViewResult Crumbs() {
    if (Request.Url.IsLoopback()) {
       return PartialView("DebugCrumbs");
    } else {
       return PartialView("Crumbs");
    }
 }

创建一个Crumbs和DebugCrumbs视图,该视图将被调用为本地视图。