2013-06-04 6 views
6

Ich habe den folgenden Code:RazorEngine mit Layout: Objektverweis nicht auf eine Instanz eines Objekts festgelegt

public string View(string view, object model) 
{ 
    var template = File.ReadAllText(HttpContext.Current.Request.MapPath(@"~\Views\PublishTemplates\" + view + ".cshtml")); 
    if (model == null) 
    { 
     model = new object(); 
    } 
    return RazorEngine.Razor.Parse(template, model); 
} 

und ich bin mit der folgenden Ansicht

@model NewsReleaseCreator.Models.NewsRelease 
@{ 
    Layout = "~/Views/Shared/_LayoutBlank.cshtml"; 
} 
@Model.Headline 

Ich erhalte:

[NullReferenceException: Objektverweis nicht auf eine Instanz eines Objekts festgelegt.] RazorEngine.Templating.TemplateBase.RazorEn gine.Templating.ITemplate.Run (ExecuteContext Kontext) in C: \ Users \ Matthew \ Dokumente \ GitHub \ RazorEngine \ src \ Core \ RazorEngine.Core \ Templating \ TemplateBase.cs: 139

Wenn ich entfernen die Layout-Linie, es funktioniert

Mein Layout

<!DOCTYPE html> 
<html> 
<head> 
    @RenderSection("MetaSection", false) 
    <title>@ViewBag.Title</title> 
    @RenderSection("HeaderSection", false) 
</head> 
<body> 
    @RenderBody() 
</body> 
</html> 

Gedanken?

Antwort

0

Ich landete nicht Razor Motor

Meine Lösung unter Verwendung eines Controller-Context up erfordert, damit ich das eine vom Controller verwenden nur die aufgerufen wurde. Also in meinem Controller

InstanceOfMyClass.ControllerCurrent = this 

Und in MyClass

public string RenderViewToString(string viewName, object model, string layoutName) 
    { 
     ControllerCurrent.ViewData.Model = model; 
     try 
     { 
      using (StringWriter sw = new StringWriter()) 
      { 
       ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerCurrent.ControllerContext, viewName, layoutName); 
       ViewContext viewContext = new ViewContext(ControllerCurrent.ControllerContext, viewResult.View, ControllerCurrent.ViewData, ControllerCurrent.TempData, sw); 
       viewResult.View.Render(viewContext, sw); 
       return sw.GetStringBuilder().ToString(); 
      } 
     } 
     catch (Exception ex) 
     { 
      return ex.ToString(); 
     } 
    } 
3

sah I Quellen TemplateBase.cs (https://github.com/Antaris/RazorEngine/blob/master/src/Core/RazorEngine.Core/Templating/TemplateBase.cs):

line 139: return layout.Run(context); 

Nullreferenceexception possibe, wenn 'Layout' Variable null ist. Ok, was ist "Layout"?

line 133: var layout = ResolveLayout(Layout); 

Tauche noch tiefer (https://github.com/Antaris/RazorEngine/blob/master/src/Core/RazorEngine.Core/Templating/TemplateService.cs):

public ITemplate Resolve(string cacheName, object model) 
{ 
    CachedTemplateItem cachedItem; 
    ITemplate instance = null; 
    if (_cache.TryGetValue(cacheName, out cachedItem)) 
     instance = CreateTemplate(null, cachedItem.TemplateType, model); 

    if (instance == null && _config.Resolver != null) 
    { 
     string template = _config.Resolver.Resolve(cacheName); 
     if (!string.IsNullOrWhiteSpace(template)) 
      instance = GetTemplate(template, model, cacheName); 
    } 

    return instance; 
} 

Und ich sehe hier, dass Nullreference möglich ist, wenn _config.Resolver null ist. Überprüfen Sie Ihren Resolver.

+0

nicht sicher, was ein Resolver ist aber ich vermisste wahrscheinlich etwas offensichtlich – Jeff

+0

Meine Lösung war, nicht Rasierapparat-Engine zu verwenden. Ich werde jetzt meine Antwort posten – Jeff

Verwandte Themen