2013-12-12 1 views
1

Возможно, я не позвоню RazorEngine в нужное место.Вызов RazorEngine.Parse() в действии контроллера не работает с плохой HttpContextBase

В моем управлении контроллером я использую следующий код для вызова RazorEngine. Но я думаю, что это может быть неверно, как при вызове .Execute(), а затем в GetActionCache MVC() HttpContextBase.Items завершается с исключением «метод не реализован».

Я называю RazorEngine неправильным способом? @ Html.LabelFor() работает нормально.

string template = "@Html.EditorFor(model => model.OldPassword)"; 
string result = string.Empty; 
     var config = new RazorEngine.Configuration.TemplateServiceConfiguration 
     { 
      BaseTemplateType = typeof(System.Web.Mvc.Helpers.HtmlTemplateBase<>) 
     }; 

     using (var service = new RazorEngine.Templating.TemplateService(config)) 
     { 
      // Use template service. 
      RazorEngine.Razor.SetTemplateService(service); 
      result = RazorEngine.Razor.Parse(template, model); 
     } 

ответ

0

powercat97 over на странице проблем github имеет обходное решение проблемы, которая обращается к этому вопросу. https://github.com/Antaris/RazorEngine/issues/46

Причина, по которой у меня было много проблем, заключается в том, что контекста нет. Создание нового ViewContext недостаточно. Поэтому, вызывая представление, которое, в свою очередь, вызывает наш код RazorEngine через RenderAction(), мы получаем контекст, а структура MVC имеет все необходимое, когда оно вызывается RazorEngine.

Использование AccountController в качестве примера (HtmlTemplateBase происходит от RazorEngine issues with @Html и http://www.haiders.net/post/HtmlTemplateBase.aspx):

public ActionResult Test() 
{ 
    var model = new MySite.Models.LocalPasswordModel(); 
    model.OldPassword = "MyOldPwd"; 
    model.NewPassword = "SomeNewPwd"; 
    return PartialView(model); 
} 

[ChildActionOnly()] 
    public string TestTemplate(MySite.Models.LocalPasswordModel vm) 
    { 
     string result = string.Empty; 
     string template = "@Html.EditorFor(model => model.OldPassword)"; 
     var config = new RazorEngine.Configuration.TemplateServiceConfiguration 
     { 
      BaseTemplateType = typeof(HtmlTemplateBase<>) 
     }; 

     using (var service = new RazorEngine.Templating.TemplateService(config)) 
     { 
      // Use template service. 
      RazorEngine.Razor.SetTemplateService(service); 
      result = RazorEngine.Razor.Parse(template, vm, "MyTemplateName"); 
     } 
     return result; 
    } 

и в Test.cshtml:

@model TestRazorEngine.Models.LocalPasswordModel 
@{ Html.RenderAction("TestTemplate", new { vm = Model }); } 
Смежные вопросы