2

현재 MVC 3을 사용하여 다중 소유 웹 응용 프로그램을 작성 중입니다. 적어도 30 개의 다른 웹 사이트가 공통 코드베이스를 공유하며 유사한 under-the-hood 기능성, 그들은 크게 달라질 필요가있다. 결과적으로 URL을 사용하여 클라이언트를 내부적으로 분리하고 오버라이드 된 Razor 뷰 엔진 (최소한 뷰를 찾는 측면에서)을 사용하여 지정된 작업에 대한 사용자 정의보기 또는 기본보기를 자동으로 선택합니다.작업의 출력을 시작하고 끝내기 위해 선택한보기 경로를 HTML 주석으로 삽입

복잡한 페이지를 분류하는 데 도움이되도록 특정보기는 일반적으로 자체 포함 된 동작으로 렌더링되는 여러 개의 부분을 사용하므로 일반적으로 사용자 지정보기 나 부분보기의 HTML 차이가 작기 때문에 최소화 할 수 있습니다 클라이언트의 사이트와 관련된 모든 코드.

나는 그 배경을 따라 왔으면 좋겠다.

그래서 하나의 HTML 페이지는 클라이언트의 특정 폴더 또는 범용 버전에서 올 수있는 HTML 부분보기의 작은 조각으로 구성 될 수 있습니다. 나는 우리 디자이너가 쉽게 을보고 페이지의 사소한 변경을 쉽게 할 수 있기를 바라고있다. 폴더 구조에서이 변경하려는 HTML 비트가있는 곳이다.

나의 제안은 다음 각 부분과 같은 HTML 주석과 '괄호'될 것입니다 :

{부분의 내용} 분명히

내가 수동으로 이러한를 둘 수 있었다,하지만 그건 단지 문제가 있는지, 오타가 있는지, 올바른 URL로 업데이트되지 않은 복사 된 클라이언트 버전에 대해 묻습니다. 어떤 상황에서 이것을 얻어서 주입하는 것이 가능할 것이라고 나는 생각한다.

동시에, 특정 작업에 대해이 작업을 수행 할 수 없도록해야합니다. 예를 들어 부분 일 경우이 텍스트 영역 내에 텍스트를 생성 할 수 있습니다. 예를 들어 주석이 적절하지 않을 수 있습니다. 전체적으로 나는이 말을 에 넣기를 바랍니다. 나는 그것이 적절하지 않다고 말하지 않습니다.

내게있어서 이것은 액션에 대한 액션 필터를 제안합니다.이 액션 필터는 사이트 전체에 적용 할 수 있고 특정 액션에 대해서는 해제 할 수 있습니다. 무시 무시한 이벤트 중 하나를 통해이 경로를 확인할 수 있었으면 좋겠지 만 저장되어있는 곳을 찾을 수없는 것 같습니다. 또한 OnResultExecuted는 Partial이 선택되기 전에 실행되는 것으로 보이며 OnResultExecuted는 Partial의 내용을 이미 작성한 것으로 보입니다. 따라서 여기에 시작 주석을 삽입 할 수 없습니다. 또한 선택한 부분의 경로에 대한 참조를 찾을 수 없습니다.

디버그 모드에서 컴파일 할 때이 속성을 쓰는 것이 나의 의도입니다.

그래서 누구나 FindPartialView와 속성 사이에 어떤 종류의 해킹없이 선택된 뷰의 경로를 가져올 수 있는지 알고 있습니까? 내 애트리뷰트 방법이 최선의 선택인가요? 아니면 이것을 수행하는 더 쉬운 방법이 있습니까? 이미 뭔가가 이미 내장되어 있습니다!

많은 도움에 감사드립니다.

답변

0

글쎄, 나는 이것을 원한 것에 대해 결코 잊지 않았으며, 언젠가는 언젠가는 그것을 풀어 주길 바랐다. 그리고 고맙게도 나는 가지고있다.

public abstract class PaladinWebViewPage : PaladinWebViewPage<dynamic> 
{ 
} 

public abstract class PaladinWebViewPage<TModel> : WebViewPage<TModel> 
{ 
    public bool DisplaySourceCodeComments 
    { 
     get { return ((bool?) ViewBag.__DisplaySourceCodeComments) ?? false; } 
     set { ViewBag.__DisplaySourceCodeComments = value; } 
    } 

    public override void ExecutePageHierarchy() 
    { 
     base.ExecutePageHierarchy(); 

     // Filters can be used to set and clear this value so we can decide when to show this comment 
     if (!DisplaySourceCodeComments) return; 

     var sw = Output as StringWriter; 
     if (sw == null) return; 

     var sb = sw.GetStringBuilder(); 
     sb.Insert(0, string.Format("<!-- Start of {0} -->", VirtualPath)); 
     sb.AppendFormat("<!-- End of {0} -->", VirtualPath); 
    } 

VirtualPath이 우리에게 HTML을 구축하는 데 사용되는 정확한 파일을 알려줍니다, 그래서 우리는 할 수 있습니다

나는 기본 WebViewPage를 (필자는 면도기 엔진을 사용) 오버라이드 (override), 특히 ExecutePageHierarchy에서 한

는 의견을 주입하는 앞뒤에 파일 이름을 삽입하십시오. 기본값은 이 아니므로 표시 설명 (DisplaySourceCodeComments의 "?? false")이므로 현재로서는 아무 것도하지 않습니다.

또한이보기 페이지를 사용하려면 Views/Web.config를 편집하고 pageBaseType을이 유형으로 변경해야합니다.

내가 선택적으로 이러한 의견을 켜려고 그렇게 떨어져 내가 ActionFilter 만들었습니다

public class DisplaySourceCodeCommentsAttribute : ActionFilterAttribute 
{ 
    private readonly bool _displaceSourceCodeComments; 

    public DisplaySourceCodeCommentsAttribute(bool displaceSourceCodeComments) 
    { 
     _displaceSourceCodeComments = displaceSourceCodeComments; 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     base.OnActionExecuted(filterContext); 

     var viewResult = filterContext.Result as ViewResultBase; 
     if (viewResult == null) return; 

     viewResult.ViewBag.__DisplaySourceCodeComments = _displaceSourceCodeComments; 
    } 
} 

내가보기에 별도로 또한 내가 여기 ViewBag을 사용 했어 약간 불행 해요 및 페이지 오버라이드는 밀접하게 연결되지 않았으므로 필터가 뷰 페이지와 직접 상호 작용할 수있는 방법을 찾을 수 없으므로 이것이 필요한 퍼지 (fudge)의 일부입니다. ViewBag가 체인 아래로 전달되기 때문에 뷰 또는 부분에 대한 소스 코드를 표시하면 자동으로 하위 부분에 대한 소스 코드가 표시되므로 이점을 얻을 수 있습니다. 장소에두고

는 소스 코드를 켤 수있는 조치는 속성이 확인 [DisplaySourceCodeComments (참)]

또는, 분명히 잘못된

다시 그것을 해제와 코멘트 상황에 맞는 결과가 ViewResultBase는 조회수와 부분 수를 의미하므로 Json이나 Content 또는 리디렉션에는 아무런 영향이 없으므로 매우 편리합니다. 모든보기 있도록 디버그 모드에서 실행할 때

마지막으로, 나는이 작업 필터 전역을하고, 일부는 소스 댓글이 global.asax.cs에 다음 행을 추가하여 포함되어 있습니다

[#]을 만약 DEBUG

 // When in debug mode include HTML comments showing where a view or partial has come from 
     GlobalFilters.Filters.Add(new DisplaySourceCodeCommentsAttribute(true)); 

[#] ENDIF

나는 마침내 내가이 다른 사람에 유용 희망을 이렇게 분류되어있어 정말 행복 해요.