2010-05-23 4 views
1

나는 까다로운 문제가 있으며 뷰 렌더링 프로세스에서이를 시도하기 위해 어디에서 확실하지 않습니다. 나는 MVC에 간단한 블로그/CMS를 구축하고 있는데 사용자가 관리자로 로그인하면 (그리고 편집 권한이있는 경우) 일부 html (부분보기가 바람직 함)을 페이지에 삽입하고 싶습니다.프로그래밍 방식으로 뷰에 HTML 삽입

분명히 렌더링 부분을 마스터 페이지 등에 추가 할 수 있습니다.하지만 내 시스템의 마스터 페이지 /보기는 CMS의 "템플릿"이므로 CMS 관련 < % %> 마크 업을 포함해서는 안됩니다. 나는 렌더링 과정의 일부에 연결하고 html을 직접 삽입하고 싶습니다.

누구나 MVC에서이를 수행하는 방법을 알고 있습니까? ViewPage, ViewEngine은 어디에서 가장 좋을까요?

감사합니다,

이안

답변

0

확인 이것은 다소 엉망이었습니다. 결과는 약간 해킹되었습니다. 그러나 그것은 올바르게 작동합니다. 그게 바로 문제입니다. ...

protected override void Render(System.Web.UI.HtmlTextWriter writer) 
    { 
     if (!User.Identity.IsAuthenticated || !User.IsInRole("Admin")) 
     { 
      // If not admin continue as normal 
      base.Render(writer); 
      return; 
     } 

     // Taking a leaf out of the move viewstate to the bottom of page playbook 
     var stringWriter = new System.IO.StringWriter(); 
     var htmlWriter = new HtmlTextWriter(stringWriter); 
     base.Render(htmlWriter); 
     var html = stringWriter.ToString(); 
     var endOfBody = html.IndexOf("</body>") - 1; 
     if (endOfBody >= 0) 
     { 
      var adminConsole = Html.RenderPartialAsString("AdminPanel"); 
      html = html.Insert(endOfBody, adminConsole); 
     } 
     writer.Write(html); 
    } 

Render 메서드를 재정의하는 자체 ViewPage를 구현합니다. 이렇게하면 사용자가 관리자로 로그인했는지 확인하고 페이지가있는 경우 페이지 하단에 부분이 렌더링됩니다. webforms의 오래된 skool viewstate 해킹과 매우 유사합니다.

즐기십시오.

1

당신은 페이지의 어딘가에 HTML 조각을 삽입 Html.RenderPartial을 사용할 수 있습니다. 뷰에 사용할 수 없지만 마스터에서만 삽입 할 수있는 경우에는 <asp:ContentPlaceHolder ID="Admin" runat="server" /> 자리 표시자를 마스터에 배치하고 뷰에서이를 무시하고 부분을 삽입하면됩니다. 그러한 자리 표시자를 배치하는 것이 허용되지 않는 경우 AJAX를 다음과 같이 사용할 수 있습니다. $('#adminHolder').load('/home/admin');하지만 사용자가 자바 스크립트를 사용할 수없는 경우에 대비하여 이전 방식으로 이동합니다.

+0

CMS에서보기 및 마스터 페이지는 템플릿 작성자가 만듭니다. 올바른 Html.RenderPartial을 추가하는 것에 의존 할 수는 없습니다. 그래서 실제로 프로그래밍 방식이 필요합니다. – madcapnmckay

+0

두 가지가 밀접하게 관련되어 있습니다. 나는 어떤 견해도 건드리지 않고 프로그래밍 방식으로 이것을 달성 할 수있는 방법을 전혀 모르고있다. 템플릿 작성자가 적절한 HTML 조각을 어디에 삽입할지 결정할 수 있습니까? –

+0

삽입 된 html은 템플릿의 일부가 아닙니다. 그것은 관리 인터페이스를 포함하고 모달 팝업으로 나타나기 위해 바디의 끝에 삽입 될 필요가 있습니다. 이것이 고전적인 webforms 앱 이었다면 본체에 컨트롤을 삽입하는 재정의 된 OnPreRender 메서드가있는 기본 페이지를 추가합니다. MVC에서 비슷한 것을 할 수있는 방법이 있어야합니다. – madcapnmckay

관련 문제