如何在ASP.NET MVC4 Api控制器中将视图呈现为字符串

4
ASP.NET MVC4 Web API控制器应该将Razor视图作为HTML返回到JSON结果属性中。
我尝试了控制器。
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,为什么不使用普通控制器操作和部分视图呢? - iCollect.it Ltd
WebAPI方法返回JSON数据。其中一个属性包含响应数据的HTML格式。将此内容作为HTML添加到页面以避免完全刷新页面。因此,我需要从WebAPI生成HTML。 - Andrus
我在http://stackoverflow.com/questions/26854342/exception-in-mono-system-web-rendering-view-in-asp-net-web-api-controller发布了相关问题。其中包含的答案在Mono中不起作用。 - Andrus
1个回答

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不属于微软,也不是ASP.NET的一部分。虽然这个答案可以用来将Razor视图呈现为字符串,但我认为这仍然应该被提及。 - Dimskiy
@Dimskiy 你知道微软是否有类似的包可以在.NET Core Api中使用吗? - bbrinck
@bbrinck 我最近在使用 RazorLight。它不是很好,但能完成工作... - Andrei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接