2012-10-30 3 views
2

우리는 다양한 언어로 작성된 구현과 함께 웹 응용 프로그램에서 사용하는 사용자 정의 템플리트 프레임 워크를 가지고 있으며이를 ASP에서 사용할 수 있는지 여부를 조사하고 있습니다. Razor View 엔진을 사용하는 .NET MVC 응용 프로그램입니다. 이미 Web Forms View 엔진을 사용하는 구현이 있지만 Razor도 사용할 수있게되어 있습니다.사용자 정의 템플릿 프레임 워크와 함께 면도기 뷰 엔진 사용

템플릿은 런타임에 해석 가능한 html로 해석되고 대체되는 매크로 태그를 포함하는 html 파일로 정의됩니다. 당신이 볼 수 있듯이

[doctype] 
<html> 
    <head> 
    [HeadScript] 
    [HeadSectionText] 
    </head> 
    <body id="[if Home][Home][else]body[end if]"> 
    [form] 
     [Content] 
    [end form] 
    [EndBodyScript] 
    </body> 
</html> 

, 이것은 간단한 조건부 로직 구현에 의해 처리되는 일부 문서의 여러 섹션으로 HTML을 주입 할 수있는 기회가있다 -이 : 다음은이 파일의 매우 단순화 된 버전입니다. 이것을 Razor와 함께 사용하려면 렌더링 된 Razor 뷰에서 HTML을 삽입하는 것을 포함하여 템플릿의 모든 매크로 태그를 처리 할 수 ​​있어야하며이 작업의 출력을 최종적으로 HTML로 보내야합니다. 클라이언트에게.

저는 MVC 개발과 관련해서는 꽤 초록색이지만, 사용자 정의 ViewEngine 및 IView 구현을 생성 할 수 있음을 알고 있습니다. RazorView 클래스를 사용하여 사용자 지정 엔진을 사용하여 실제 내용을 템플릿에 삽입하여 원하는대로 만들 수 있습니다. 이게 실현 가능한 해결책처럼 들리니? 그렇다면 누군가 나 시작을위한 조언을 갖고 있습니까?

현재 ASP.NET WebForms 엔진을 사용하여 부분 면도기 뷰를 렌더링하는 kludgy 솔루션이 있지만 장기적으로 WebForms 엔진을 완전히 사용할 수있는 솔루션을 선호합니다.

오른쪽 방향으로 어떤 shoves도 크게 감사합니다.

+0

좋은 질문입니다. 사실 나는 비슷한 문제가 있습니다. 그것에 관한 어떤 뉴스? –

+0

이상적인 솔루션을 찾지 못했기 때문에 부분 면도기 뷰가 포함 된 페이지에는 ASPX보기 엔진을 사용합니다. 예쁘지는 않지만 작동합니다. 그리고 여전히 내 마크 업 대다수에 대해 면도기를 사용합니다. – Cleggy

답변

1

나는 뭔가를 알아 냈습니다. 내 문제가 정확히 똑같지는 않지만 확실히 도움이 될 수 있습니다. 하지만 먼저 일을 먼저하십시오.

문제

나는 (내 경우에는 그들이 부분 뷰입니다) 컨트롤의 번호를 가지고있다. 예를 들면 :

내가 예를 들어, (데이터베이스 또는 Web.config의에서) 이러한 컨트롤의 그룹을 정의 할
Views/Shared/EditName.cshtml 
Views/Shared/EditAddress.cshtml 
Views/Shared/EditEmail.cshtml 
Views/Shared/EditFavoriteColour.cshtml 

:

SimpleEditGroup: 
    EditName 
ExtendedEditGroup: 
    EditName 
    EditEmail 
FullEditGroup: 
    EditName 
    EditAddress 
    EditEmail 
    EditFavoriteColour 

은 그 때 나는 특정 그룹을 기반으로 뷰를 렌더링합니다. 나는 다음 구문이 충분하다고 생각했다. 뷰의 이름으로 시작하는 경우

  1. :

    솔루션의

    @Html.Partial("ControlGroup:ExtendedEditGroup", Model) 
    

    초안 나는 다음을 수행 할 것입니다 내 자신의 렌더링 엔진을 창조하고 싶었다 "ControlGroup :"다음 이전에 정의 된 그룹을 사용하여 페이지를 렌더링하십시오. 각 컨트롤은 RazorViewEngine에 의해 렌더링되어야합니다.

  2. 보기의 이름이 "ControlGroup :"으로 시작하지 않으면 RazorViewEngine이 작동하도록하십시오.

연구

내가 찾은 다음 리소스 : CodeProject의에

  1. 기사 - StackOverflow의 질문에 따라 Custom ViewEngine in ASP.NET MVC3
  2. 기사 - Creating a Widget system in ASP.NET MVC 3
  3. 나는 당신에게 책을 추천 Pro ASP.NET MVC 3 Framework . ASP.NET MVC 3에서 사용자 정의 할 수있는 것들을 알려줍니다.
  4. 물론 소스 코드 ASP.NET MVC 3 RTM은 매우 유용했습니다.

최종 솔루션

MyViewEngine :

public class MyViewEngine : RazorViewEngine 
{ 
    IDictionary<string, List<string>> groups = new Dictionary<string, List<string>>(); 

    public MyViewEngine() 
    { 
    // Temporary data source 
    groups["SimpleEditGroup"] = new List<string>() { "EditName"}; 
    groups["ExtendedEditGroup"] = new List<string>() { "EditName", "EditEmail"}; 
    } 

    public override ViewEngineResult FindView(ControllerContext controllerContext, 
      string viewName, string masterName, bool useCache) 
    { 
    if (viewName.StartsWith("ControlGroup")) 
    { 
     var groupName = viewName.Split(':')[1]; 
     var controls = new List<ViewEngineResult>(); 

     foreach (var controlName in groups[groupName]) 
     { 
     // Find each control using Razor magic 
     var control = base.FindPartialView(controllerContext, controlName, useCache); 
     if (control.View != null) 
     { 
      controls.Add(control); 
     } 
     } 

     if(controls.Count > 0) 
     return new ViewEngineResult(new MyView(controls), this); 
    } 

    return base.FindView(controllerContext, viewName, masterName, useCache); 
    } 
} 

MyView.cs :

public class MyView : IView 
{ 
    IList<ViewEngineResult> controls; 

    public MyView(IList<ViewEngineResult> _controls) 
    { 
    controls = _controls; 
    } 

    public void Render(ViewContext viewContext, TextWriter textWriter) 
    { 
    // For simplicity I used table for layout 
    textWriter.Write("<table border='1'>"); 

    foreach (var ctrl in controls) 
    { 
     textWriter.Write("<tr><td>"); 

     // Render control using Razor 
     ctrl.View.Render(viewContext, textWriter); 

     textWriter.Write("</td></tr>"); 
    } 

    textWriter.Write("</table>"); 
    } 
} 

ViewEngines.Engines.Add(new MyViewEngine());

의 Global.asax에 새 엔진을 등록하는 것을 잊지 마세요Render.Partial를 사용하거나 그냥 내 컨트롤러에서 PartialView을 돌아보기에 포함 :

나는 두 가지 방법을 사용할 수 있습니다 종료

해피.

도움이되는지 알려주세요. 또한 솔루션을 공유 할 수도 있습니다.

+0

이 모든 것이 매우 유망 해 보입니다. 나는 실제로 다른 (MVC가 아닌) 프로젝트로 옮겼지만, 게시 한 정보를 사용하여 이것을 다시 방문 할 시간을 찾으려고 노력할 것이다. – Cleggy

관련 문제