2013-06-04 18 views
6

ho il seguente codice:RazorEngine con la disposizione: riferimento oggetto non impostato su un'istanza di un oggetto

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); 
} 

e sto usando il seguente vista

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

sto ottenendo:

[NullReferenceException: riferimento oggetto non impostato su un'istanza di un oggetto.] RazorEngine.Template.TamplateBase.RazorEn gine.Templating.ITemplate.Run (ExecuteContext contesto) in C: \ Users \ Matthew \ Documenti \ GitHub \ RazorEngine \ src \ Core \ RazorEngine.Core \ Templating \ TemplateBase.cs: 139

Se rimuovo il layout di riga funziona benissimo

mio layout

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

Pensieri?

risposta

0

ho finito per non usando Razor motore

La mia soluzione richiede un contesto di controllo così mi basta usare l'uno dal controller che è stato chiamato. Così nel mio controller

InstanceOfMyClass.ControllerCurrent = this 

E 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

ho guardato fonti di TemplateBase.cs (https://github.com/Antaris/RazorEngine/blob/master/src/Core/RazorEngine.Core/Templating/TemplateBase.cs):

line 139: return layout.Run(context); 

NullReferenceException possibe, se la variabile 'Layout' è nullo. Ok, che cos'è 'layout'?

line 133: var layout = ResolveLayout(Layout); 

andare più in profondità (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; 
} 

E, che vedo qui, che NullReference è possibile, se _config.Resolver è nullo. Controlla il tuo Resolver.

+0

Non so cosa sia un resolver è ma probabilmente perso qualcosa ovvio – Jeff

+0

mio eventuale soluzione era di non utilizzare il motore rasoio. Pubblicherò la mia risposta ora – Jeff

Problemi correlati