Где поставить вид логики? - PullRequest
2 голосов
/ 18 января 2011

Я немного запутался в отношении шаблонов проектирования ASP.NET MVC. У меня есть мастер-страница, включающая частичное представление, которое отображает панировочные сухари:

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

Дело в том, что я хочу, чтобы ссылки на крошку работали как на производстве, так и в моей среде разработки. Так что мой код в частичном представлении выглядит примерно так:

<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 ]

7 голосов
/ 18 января 2011

Не уверен, какую версию 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.

0 голосов
/ 18 января 2011

Вы можете поместить поколение хлебных крошек в детское действие. Это даст вам совершенно новый вид и контроллер

На главной странице:

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

MasterController:

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

Создание представления Crumbs и DebugCrumbs, которое будет называться локальным или нет.

...