MVC将PartialViewResult渲染为字符串

时间:2013-07-09 17:39:20

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-mvc-partialview

免责声明:我编辑了这个问题,因为我改变了这个过程,但它没有改变任何问题......

我正在尝试将PartialViewResult呈现为字符串,我尝试使用此问题中的RenderRazorViewToString方法render a view as a string ...,我从此qustion获得了提示{ {3}}

我的问题是,字符串看起来像这样:

<$A$><h1>SomeHeader</h1> 
<table</$A$><$B$> class="table table-striped"</$B$><$C$>> <tbody</$C$><$D$> data-bind="template: { name: 'eventTemplate', foreach: events }"</$D$><$E$>></tbody>
</table></$E$>

而不是

<h1>SomeHeader</h1>
<table class="table table-striped">
    <tbody data-bind="template: { name: 'eventTemplate', foreach: events }"></tbody>
</table>

更新:
流程如下所示:

public ActionResult Index(string item, long id)
{
    var cont = SomePartialView(item, id);
    return View(model: RenderRazorViewToString(cont));
}

现在View只是渲染字符串:

@Model

RenderRazorViewToString(PartialViewResult)会返回此“残缺”字符串......

3 个答案:

答案 0 :(得分:6)

作为调用Action的结果,也可以返回 ContentResult / Content 对象。

然后在视图中使用返回的结果。

以下是此解决方案的说明(需要RenderViewToString方法):

查看:

@Html.Action("GetHtmlAction")

PartialView(html内容的来源):

<h1>SomeHeader</h1>
<table class="table table-striped">
    <tbody data-bind="template: { name: 'eventTemplate', foreach: events }">
        <tr>
            <td>Fake Cell</td>
        </tr>
    </tbody>
</table>

控制器:

public ActionResult GetHtmlAction() {
    string htmlContent = RenderRazorViewToString("FakePartialView", null);
    return Content(htmlContent);
}

public string RenderRazorViewToString(string viewName, object model) {
    ViewData.Model = model;
    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();
    }
}

答案 1 :(得分:2)

这已得到微软的证实。

这是Visual Studio 2013 Preview附带的Asp.NET版本中的一个错误。 它已在Visual Studio 2013 RC中修复。

答案 2 :(得分:0)

在将字符串转换为json之前,字符串是什么样的?它有美元吗? 如果您只使用预期输出(例如

)创建一个字符串会发生什么

"<h1>SomeHeader</h1><table class=\"table table-striped\"><tbody data-bind=\"template: { name:'eventTemplate', foreach: events }\"></tbody></table>"

转换为json时是否有美元符号? 如果没有,那么视图中是否有任何可能导致美元元素的奇怪字符或行结尾。