加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – MVC 5渲染视图到字符串

发布时间:2020-12-15 23:36:37 所属栏目:asp.Net 来源:网络整理
导读:看来,用于将视图呈现到字符串中的大多数代码在MVC 5中不起作用. 我有最新的MVC 5.1.2模板,我试图渲染视图到字符串. public static String RenderViewToString(ControllerContext context,String viewPath,object model = null) { context.Controller.ViewDat
看来,用于将视图呈现到字符串中的大多数代码在MVC 5中不起作用.

我有最新的MVC 5.1.2模板,我试图渲染视图到字符串.

public static String RenderViewToString(ControllerContext context,String viewPath,object model = null)
    {
        context.Controller.ViewData.Model = model;
        using (var sw = new StringWriter())
        {
            var viewResult = ViewEngines.Engines.FindView(context,viewPath,null);
            var viewContext = new ViewContext(context,viewResult.View,context.Controller.ViewData,context.Controller.TempData,sw);
            viewResult.View.Render(viewContext,sw);
            viewResult.ViewEngine.ReleaseView(context,viewResult.View);
            return sw.GetStringBuilder().ToString();
        }
    }

那么它的工作,但它的输出包含大量的$标记,而不是标签.我读了一些关于它是固定在RC版本,但这是旧消息.

问题看起来像这样

<$A$><h1></h1> 
<table</$A$><$B$> class=""</$B$><$C$>> <tbody</$C$><$D$></$D$><$E$>></tbody>
</table></$E$>

我想问一下,如何在最新的MVC 5模板中将视图呈现为字符串?
谢谢.

解决方法

好的,似乎我找到了一个解决方案.这个想法的作者是雅基尔庄园.
class FakeController : ControllerBase
{
    protected override void ExecuteCore() { }
    public static string RenderViewToString(string controllerName,string viewName,object viewData)
    {
        using (var writer = new StringWriter())
        {
            var routeData = new RouteData();
            routeData.Values.Add("controller",controllerName);
            var fakeControllerContext = new ControllerContext(new HttpContextWrapper(new HttpContext(new HttpRequest(null,"http://google.com",null),new HttpResponse(null))),routeData,new FakeController());
            var razorViewEngine = new RazorViewEngine();
            var razorViewResult = razorViewEngine.FindView(fakeControllerContext,viewName,"",false);

            var viewContext = new ViewContext(fakeControllerContext,razorViewResult.View,new ViewDataDictionary(viewData),new TempDataDictionary(),writer);
            razorViewResult.View.Render(viewContext,writer);
            return writer.ToString();

        }
    }
}

这是一个假的上下文和回应的伎俩.

例:

String renderedHTML = RenderViewToString("Email","MyHTMLView",myModel );

我的文件MyHTMLView.cstml存储在Views / Email / MyHTMLView.cshtml中.电子邮件是一个假控制器名称.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读