【问题标题】:How to render view to string in ASP.NET MVC4 Api controller如何在 ASP.NET MVC4 Api 控制器中将视图呈现为字符串
【发布时间】:2014-11-08 19:59:52
【问题描述】:

ASP.NET MVC4 Web API 控制器应在 json 结果属性中以 html 形式返回 Razor 视图。

我试过控制器

public class TestController : ApiController
{
    public HttpResponseMessage Get()
    {
        var body = RenderViewToString<object>("~/Views/Broneeri/Schedule.cshtml", new object() );
        return Request.CreateResponse(HttpStatusCode.OK, new { content = body } );
    }

    string RenderViewToString<T>(string viewName, T model)
    {
        ViewDataDictionary ViewData = new ViewDataDictionary(model);
        TempDataDictionary TempData = new TempDataDictionary();
        ControllerContext controllerContext = new System.Web.Mvc.ControllerContext();
        controllerContext.RouteData = new RouteData();

        controllerContext.RouteData.Values.Add("controller", "Schedule");
        using (var sw = new StringWriter())
        {
            var viewResult = ViewEngines.Engines.FindPartialView(controllerContext, viewName);
            var viewContext = new ViewContext(controllerContext, viewResult.View, ViewData,          
                       TempData, sw);
            viewResult.View.Render(viewContext, sw);
            viewResult.ViewEngine.ReleaseView(controllerContext, viewResult.View);
            return sw.GetStringBuilder().ToString();
        }
    }
 }

但我遇到了一个奇怪的异常

System.NotImplementedException was unhandled by user code
  HResult=-2147467263
  Message=The method or operation is not implemented.
  Source=System.Web
  StackTrace:
       at System.Web.HttpContextBase.get_Items()
       at System.Web.Mvc.VirtualPathProviderViewEngine.GetPath(ControllerContext controllerContext, String[] locations, String[] areaLocations, String locationsPropertyName, String name, String controllerName, String cacheKeyPrefix, Boolean useCache, String[]& searchedLocations)
       at System.Web.Mvc.VirtualPathProviderViewEngine.FindPartialView(ControllerContext controllerContext, String partialViewName, Boolean useCache)
       at System.Web.Mvc.ViewEngineCollection.Find(Func`2 lookup, Boolean trackSearchedPaths)
       at System.Web.Mvc.ViewEngineCollection.Find(Func`2 cacheLocator, Func`2 locator)
...

一行

var viewResult = ViewEngines.Engines.FindPartialView(controllerContext, viewName);

如何从 ASP.NET 4 Web API 控制器的视图中返回 HTML 内容?

【问题讨论】:

  • WebAPI 用于 REST 风格的操作。如果要返回 HTML,为什么不使用普通的控制器操作和局部视图?
  • WebAPI 方法返回 json 数据。此数据的一个属性包含响应数据 html 格式。此内容作为 html 添加到页面中,以避免整个页面刷新。因此我需要从 WebAPI 生成 html
  • 我在stackoverflow.com/questions/26854342/… 中发布了相关问题,其中包含在 Mono 中不起作用的答案

标签: asp.net-mvc asp.net-mvc-4 razor asp.net-web-api razor-2


【解决方案1】:

您需要使用 NuGet 控制台Install-Package RazorEngine。这是对我有用的代码:

using RazorEngine;
using RazorEngine.Templating;

string razorTemplate = "Hello @Model!";
string html = Engine.Razor.RunCompile(
    razorTemplate, 
    "uniqueTemplateKey", // Guid.NewGuid().ToString() for example
    modelType: typeof(string), 
    model: "Lorem Ipsum");

希望对你有帮助!

【讨论】:

  • NuGet 包 RazorEngine 不属于 Mircrosoft,也不是 ASP.NET 的一部分。虽然这个答案应该适用于将 Razor 视图呈现为字符串,但我认为这仍然应该被提及。
  • @Dimskiy 你知道微软是否有类似的包可以在 .NET Core Api 中使用?
  • @bbrinck 这些天我在使用 RazorLight。这不是很好,但可以完成工作......
猜你喜欢
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
相关资源
最近更新 更多