2011-01-18 6 views
2

ASP.NET MVC의 디자인 패턴과 관련하여 다소 혼란 스럽습니다.뷰 로직을 어디에 둘까요?

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

, 내가 이동 경로 링크가 생산 및 내 dev 환경에서 모두 작업 할 : 나는 빵 부스러기를 렌더링하는 부분도 포함 Masterpage 있습니다.

<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/"); 

... 

이가 "바보"보기를 유지의 원칙을 위반 : 그래서 부분보기에 내 코드는 다음과 같이 간다? 마스터 페이지에서 이것을 추출하는 이유 중 하나가 바로이 원리입니다. 문제를 새로운 시각으로 옮겼다 고 생각하십니까? 대안은 무엇입니까?

답변

7

사용중인 MVC 버전을 잘 모릅니다. 당신이 MVC3를 사용하는 경우, 당신은 GlobalActionFilter 만들 수 있습니다 :이 필터는 다음 (있는 동적 객체) 당신의 ViewBag에 속성을 추가 할 수 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/"; 

    } 
} 

를하는 당신이에 따라 사이트의 URL을 설정, SiteUrl라고 귀하가있는 주입니다.

PartialView에서 더 이상 if 성명을 요구하지 않으며 단지 ViewBag.SiteUrl으로 전화하십시오. 또한 다른 페이지는 SiteUrl 속성에 액세스 할 수 있습니다.

0

하위 작업에 탐색 경로 생성을 넣을 수 있습니다. 이것은 masterpage에서 당신에게 완전히 새로운보기 및 컨트롤러

을 줄 것이다 :

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

MasterController :

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

만들기를 부스러기와 DebugCrumbs 그 지역 여부를 호출됩니다 볼 수 있습니다.

+0

정말 그렇지 않습니까? 컨트롤러에 Url을 작성하여 부스러기 뷰에 전달하는 것이 더 나을 것입니다. 이렇게하면 한 가지보기 만 있습니다. – Gidon

+0

@ 기드온, 오, 왜 그렇 겠지요. 그러나 이것은 뷰가 테스트해야만한다는 것을 의미합니다. 추가 테스트 및 로직을 포함해야합니다. 가능한 적은 콘텐츠/로직을 포함하는 뷰를 호출하고 싶습니다. – GvS

+0

실제로 컨트롤러에서 논리를 수행하고 [계산] URL을 뷰에 제공하도록 제안합니다 ([View] Model, ViewBag 또는 ViewData 사용) – Gidon

관련 문제