2013-12-15 8 views
3

RazorEngine을 사용하고 있는데 뷰에서 레이아웃을 지정하면 Parse 메서드가 오류를 발생시킵니다. 지정하지 않으면 구문 분석은 성공하지만 레이아웃이 없습니다 (_ViewStart.cshtml에 지정된 경우 레이아웃을 무시하는 것 같습니다). 에 대한 조언을주세요. 레이아웃과 함께 RazorEngine Parse 메서드를 어떻게 성공적으로 사용할 수 있습니까?어떻게 RazorEngine Parse 메서드를 레이아웃과 함께 사용할 수 있습니까?

나는 C 번호,보기, 아래 레이아웃을 포함했다

:

private String GetViewHtmlIncludingLayout(Controller controller, Object model, String view) 
{  
    // this returns the view as string, including its razor markup  
    string template = ControllerBaseExtensions.GetViewTemplate(controller, view);  
    // this converts the razor markup view to html 
    string result = Razor.Parse(template, model); 
    return result; 
} 

보기

@using Carnotaurus.GhostPubsMvc.Web.Models 
@model AboutModel 
@{ 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
    ViewBag.Title = "About us"; 
} 

<!-- Subhead 
================================================== --> 
<header class="jumbotron subhead"> 
    <div class="container"> 
     <div> 
      <h1>@Model.JumboTitle</h1> 
      <p class="lead"> 
       About ghost pubs.com 
      </p> 
     </div> 
    </div> 
</header> 

<div class="container"> 

    <!-- Docs nav 
    ================================================== --> 
    <div class="row"> 
     <div class="span4"> 
      <div> 
       <div> 
        <img class="img-circle face-relative" src="~/Content/bootstrap/2.3.1/img/ghostpubs/padded-logo-125x125.png" alt="Ghost Pubs" title="Ghost Pubs" /> 
       </div> 
      </div> 
     </div> 

     <div class="span8"> 

      <!-- Well 
      ================================================== --> 
      <section id="well"> 
       <div class="page-header"> 
        <h1>All about Ghost Pubs dot Com</h1> 
       </div> 
       <h2>Let's tell you who we are</h2> 
       <div class="well well-large"> 
        <p> 
         We are chaps involved in running <a href="http://www.myPubGuide.com">myPUBGUIDE.com</a>. 
    We have noticed that almost sixty public houses close each month. Therefore, given 
    the success of myPUBGUIDE, we thought it would be a good idea to launch a similar 
    website for drinking establishments that are haunted, closed, abandoned, and demolished. 
        </p> 
        <p> 
         Clearly such establishments do not belong on an active pub search. These deserve 
    a special website of their own, where your contribution would be encouraged. We 
    intend to launch this website in early 2014. We are sure that you have a ghost story 
    to share with us about your old local. 
        </p> 
        <p> 
         As the name suggests Ghost Pubs we are looking for any information you can give 
    regarding any hauntings or paranormal phenomena regarding your local pub. 
        </p> 
       </div> 

       <hr> 
      </section> 
     </div> 
    </div> 
</div> 

레이아웃

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8" /> 
    <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" /> 
    <meta name="viewport" content="width=device-width" /> 
    @Styles.Render("~/Content/css") 
    @Scripts.Render("~/bundles/modernizr") 
    <!-- styles --> 
    <link href="@Url.Content("~/content/bootstrap/2.3.1/css/bootstrap.css")" rel="stylesheet"> 
    <link href="@Url.Content("~/content/bootstrap/2.3.1/css/bootstrap-responsive.css")" rel="stylesheet"> 
    <link href="@Url.Content("~/content/bootstrap/2.3.1/css/docs.css")" rel="stylesheet"> 
    <link href="@Url.Content("~/content/bootstrap/2.3.1/css/ghostpubs/docs2.css")" rel="stylesheet"> 
    <link href="@Url.Content("~/content/bootstrap/2.3.1/css/prettify.css")" rel="stylesheet"> 
    <link href="@Url.Content("~/content/bootstrap/2.3.1/font-awesome/css/font-awesome.css")" rel="stylesheet"> 
    <link href="@Url.Content("~/content/bootstrap/2.3.1/css/bootswatch.css")" rel="stylesheet"> 
</head> 
<body data-spy="scroll" data-target=".bs-docs-sidebar"> 

    <!-- Navbar 
    ================================================== --> 
    <div class="navbar navbar-inverse navbar-fixed-top"> 
     <div class="navbar-inner"> 
      <div class="container"> 
       <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> 
        <span class="icon-bar"></span> 
        <span class="icon-bar"></span> 
        <span class="icon-bar"></span> 
       </button> 
       <a class="brand" href="/home/index">GhostPubs.com</a> 
       <div class="nav-collapse collapse"> 
        <ul class="nav"> 
         <li> 
          <a href="/home/index">Home</a> 
         </li> 
         <li> 
          <a href="/home/index">News</a> 
         </li> 
         <li> 
          <a href="/home/index">Search</a> 
         </li> 
         <li> 
          <a href="/home/about">About us</a> 
         </li> 
         <li class=""> 
          <a href="#" style="display: none">Not wired-up</a> 
         </li> 
         <li> 
          <a href="/bootstrap/index" style="display: none">Bootstrap example - Home</a> 
         </li> 
         <li> 
          <a href="/bootstrap/javascript" style="display: none">Bootstrap example- JavaScript</a> 
         </li> 
        </ul> 
       </div> 
      </div> 
     </div> 
    </div> 

    @RenderBody() 

    <!-- Footer 
    ================================================== --> 
    <footer class="footer"> 
     <div class="container"> 
      <span class="label label-info">Designed and developed by <a href="http://carnotaurus.philipcarney.com" target="_blank">Philip Carney</a> </span> 
     </div> 
    </footer> 

    @Scripts.Render("~/bundles/jquery") 
    @RenderSection("scripts", required: false) 

    <!-- Le javascript 
    ================================================== --> 
    <!-- Placed at the end of the document so the pages load faster --> 
    <script src="@Url.Content("~/content/bootstrap/2.3.1/js/bootstrap.js")"></script> 
    <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
    <script src="@Url.Content("~/content/bootstrap/2.3.1/js/jquery.js")"></script> 
    <script src="@Url.Content("~/content/bootstrap/2.3.1/js/bootstrap-transition.js")"></script> 
    <script src="@Url.Content("~/content/bootstrap/2.3.1/js/bootstrap-alert.js")"></script> 
    <script src="@Url.Content("~/content/bootstrap/2.3.1/js/bootstrap-modal.js")"></script> 
    <script src="@Url.Content("~/content/bootstrap/2.3.1/js/bootstrap-dropdown.js")"></script> 
    <script src="@Url.Content("~/content/bootstrap/2.3.1/js/bootstrap-scrollspy.js")"></script> 
    <script src="@Url.Content("~/content/bootstrap/2.3.1/js/bootstrap-tab.js")"></script> 
    <script src="@Url.Content("~/content/bootstrap/2.3.1/js/bootstrap-tooltip.js")"></script> 
    <script src="@Url.Content("~/content/bootstrap/2.3.1/js/bootstrap-popover.js")"></script> 
    <script src="@Url.Content("~/content/bootstrap/2.3.1/js/bootstrap-button.js")"></script> 
    <script src="@Url.Content("~/content/bootstrap/2.3.1/js/bootstrap-collapse.js")"></script> 
    <script src="@Url.Content("~/content/bootstrap/2.3.1/js/bootstrap-carousel.js")"></script> 
    <script src="@Url.Content("~/content/bootstrap/2.3.1/js/bootstrap-typeahead.js")"></script> 
    <script src="@Url.Content("~/content/bootstrap/2.3.1/js/bootstrap-affix.js")"></script> 

    <script src="@Url.Content("~/content/bootstrap/2.3.1/js/holder.js")"></script> 
    <script src="@Url.Content("~/content/bootstrap/2.3.1/js/prettify.js")"></script> 

    <script src="@Url.Content("~/content/bootstrap/2.3.1/js/application.js")"></script> 
</body> 
</html> 

오류입니다 : 개체 참조하지 이그제큐티브로 설정하다 개체의 에이스.

아무 내부 오류 없지만 스택 추적은 말한다 : 여기

at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context) in c:\_git\RazorEngine\src\Core\RazorEngine.Core\Templating\TemplateBase.cs:line 139 
    at RazorEngine.Templating.TemplateService.Run(ITemplate template, DynamicViewBag viewBag) in c:\_git\RazorEngine\src\Core\RazorEngine.Core\Templating\TemplateService.cs:line 608 
    at RazorEngine.Templating.TemplateService.Parse(String razorTemplate, Object model, DynamicViewBag viewBag, String cacheName) in c:\_git\RazorEngine\src\Core\RazorEngine.Core\Templating\TemplateService.cs:line 439 
    at RazorEngine.Razor.Parse(String razorTemplate, Object model) in c:\_git\RazorEngine\src\Core\RazorEngine.Core\Razor.cs:line 251 
    at Carnotaurus.GhostPubsMvc.Web.Controllers.HomeController.GetViewHtmlIncludingLayout(Controller controller, Object model, String view, String layoutPath) in c:\test\GhostPubsMvc4\Carnotaurus.GhostPubsMvc.Web\Carnotaurus.GhostPubsMvc.Web\Controllers\HomeController.cs:line 59 
    at Carnotaurus.GhostPubsMvc.Web.Controllers.HomeController.CreateHtmlPage(AboutModel model, String view, String layoutPath, String targetFilename) in c:\test\GhostPubsMvc4\Carnotaurus.GhostPubsMvc.Web\Carnotaurus.GhostPubsMvc.Web\Controllers\HomeController.cs:line 41 
    at Carnotaurus.GhostPubsMvc.Web.Controllers.HomeController.About() in c:\test\GhostPubsMvc4\Carnotaurus.GhostPubsMvc.Web\Carnotaurus.GhostPubsMvc.Web\Controllers\HomeController.cs:line 34 
    at lambda_method(Closure , ControllerBase , Object[]) 
    at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
    at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.ActionInvocation.InvokeSynchronousActionMethod() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__36(IAsyncResult asyncResult, ActionInvocation innerInvokeState) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End() 
    at System.Web.Mvc.Async.AsyncResultWrapper.End[TResult](IAsyncResult asyncResult, Object tag) 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3c() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass45.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3e() 
+0

무엇이 오류입니까? – bump

+0

좋은 점 - 나는 그것을 포함하도록 질문을 업데이 트했습니다 – CarneyCode

+0

중복 가능성이 있음 [RazorEngine layouts] (http://stackoverflow.com/questions/11414194/razorengine-layouts) – Grundy

답변

2

안녕 내가보기 및 PartialView 모두 작동 문제에 대한 최고의 대체 솔루션 중 하나 있습니다. 그것은 뷰의 레이아웃 유무를 의미합니다. 주어진 솔루션 여러분의 Methods에서 구현 한 문자열을 정확하게 반환하십시오. https://stackoverflow.com/a/18978036/2318354에 이미이 솔루션을 게시했습니다. 컨트롤러, 뷰 및 모델의 세부 정보에서 설명 드리겠습니다.

먼저 다음 방법으로 하나의 클래스를 만듭니다.

public static class RazorViewToString 
{ 
    public static string RenderRazorViewToString(this Controller controller, string viewName, object model) 
    { 
     if (controller == null) 
     { 
      throw new ArgumentNullException("controller", "Extension method called on a null controller"); 
     } 

     if (controller.ControllerContext == null) 
     { 
      return string.Empty; 
     } 

     controller.ViewData.Model = model; 
     using (var sw = new StringWriter()) 
     { 
      var viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName); 
      var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw); 
      viewResult.View.Render(viewContext, sw); 
      viewResult.ViewEngine.ReleaseView(controller.ControllerContext, viewResult.View); 
      return sw.GetStringBuilder().ToString(); 
     } 
    } 

} 
하나 개의 모델 이름을 만들기 이제 간단한

Test.cs

public class Test 
{ 
    public string Name { get; set; } 
} 

컨트롤러는 레이아웃 여부 그것을 사용하는 경우에도 귀하의보기에 지금이

public ActionResult Index() 
    { 
     Test test = new Test(); 
     test.Name = "XYZ"; 
     string html = RazorViewToString.RenderRazorViewToString(this, "~/Views/Test/index.cshtml", test); 
     return View(); 
    } 

처럼해야 보기가 다음과 같이 잘 작동합니다.

@model W2G.Models.Test 
@using W2G.App_GlobalResources; 
@{ 
ViewBag.Title = "Index"; 
Layout = "~/Views/Shared/_Layout.cshtml"; 
} 
This is test @Model.Name 

위의 솔루션은 당신이 원하는 정확하게 당신의 면도기에서 반환됩니다. 구분

나는 그것이 당신을 도울 희망이있어.

+0

그것은 좋아 보인다; 그것이 통합되는지 봅시다. – CarneyCode

+0

친절하게도 내 "Action"에서 "return View();"를 사용한다고 생각합니다. 대신 문자열이나 다른 것을 원한다면 "반환보기();" 단순히 "보기"를 호출하고 그 내용을 표시합니다. – Dilip0165

+0

내가보기 전에이 메소드를 호출() : 공공 정적 문자열 PrepareView (이 컨트롤러 컨트롤러, 개체 모델, 문자열 viewName과 = NULL) { 경우 (String.IsNullOrEmpty (viewName과)) { viewName과 = controller.ControllerContext.RouteData .GetRequiredString ("액션"); } 문자열 viewPath = GetVirtualViewPath (controller, viewName); 문자열 html = RenderRazorViewToString (controller, viewPath, model); return html; } – CarneyCode