【问题标题】:Render Razor View as string resulted in extra formatting tags (tabs, line-breaks)? How to remove?将 Razor View 渲染为字符串会导致额外的格式化标签(制表符、换行符)?如何去除?
【发布时间】:2012-02-16 16:09:50
【问题描述】:

我已将这个问题作为对另一篇帖子的评论提出,但无法正常工作。我正在使用RenderRazorViewToString() method,但不知何故,返回的 JSON 获得了所有 Visual Studio 格式(制表符、空格、换行符等),这就是我所做的:

public virtual ActionResult RenderToString()
{
    var html = RenderRazorViewToString(MVC.Markets.Views._RenderToString);
    return Json(new { html = html }, JsonRequestBehavior.AllowGet);
}

这是返回的结果:

{"html": "<div class=\"frame company-quote contain\" data-module-name=\"FirstGlanceModule\">\r\n\t<div data-module-name=\"CompanyHeaderModule\">\r\n\t\t<h1>\r\n\t\t\tMicrosoft Corp <em>(MSFT:NASDAQ)</em></h1>\r\n\t</div>\r\n\t<div class=\"first-glance\" data-module-name=\"FirstGlanceQuoteModule\">\r\n\t\t<table>\r\n\t\t\t<thead>\r\n\t\t\t\t<tr>\r\n\t\t\t\t\t<th>\r\n\t\t\t\t\t\tPrice\r\n\t\t\t\t\t</th>\r\n\t\t\t\t\t<th>\r\n\t\t\t\t\t\tChange\r\n\t\t\t\t\t</th>\r\n\t\t\t\t\t<th>\r\n\t\t\t\t\t\tVolume\r\n\t\t\t\t\t</th>\r\n\t\t\t\t\t<th>\r\n\t\t\t\t\t\tMarket Cap\r\n\t\t\t\t\t</th>\r\n\t\t\t\t</tr>\r\n\t\t\t</thead>\r\n\t\t\t<tbody>\r\n\t\t\t\t<tr>\r\n\t\t\t\t\t<td>\r\n\t\t\t\t\t\t$30.13\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td>\r\n\t\t\t\t\t\t<span class=\"neg\">-0.13</span>\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td>\r\n\t\t\t\t\t\t32.75 M\r\n\t\t\t\t\t</td>\r\n\t\t\t\t\t<td>\r\n\t\t\t\t\t\t$252.77 B\r\n\t\t\t\t\t</td>\r\n\t\t\t\t</tr>\r\n\t\t\t</tbody>\r\n\t\t</table>\r\n\t</div>\r\n\t<div class=\"controls\" data-module-name=\"FirstGlanceControlsModule\">\r\n\t\t<em>Data as of February 15, 2012 01:59:59 PM ET</em>\r\n\t\t<div>\r\n\t\t\t<button class=\"type-1\">\r\n\t\t\t\t<span>Add to Watchlist</span></button>\r\n\t\t\t<button class=\"type-2\">\r\n\t\t\t\t<span>Trade</span></button>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n"}

我尝试添加一个扩展方法 outlined here 以使用 Formatting.None 将其重新格式化为 xml 并获得了稍微好一点的结果,但仍然有额外的标签以及我可能不想要的 xml 版本标签:

{"html": "<?xml version=\"1.0\" encoding=\"utf-16\"?><div class=\"frame company-quote contain\" data-module-name=\"FirstGlanceModule\"><div data-module-name=\"CompanyHeaderModule\"><h1>\r\n\t\t\tMicrosoft Corp <em>(MSFT:NASDAQ)</em></h1></div><div class=\"first-glance\" data-module-name=\"FirstGlanceQuoteModule\"><table><thead><tr><th>\r\n\t\t\t\t\t\tPrice\r\n\t\t\t\t\t</th><th>\r\n\t\t\t\t\t\tChange\r\n\t\t\t\t\t</th><th>\r\n\t\t\t\t\t\tVolume\r\n\t\t\t\t\t</th><th>\r\n\t\t\t\t\t\tMarket Cap\r\n\t\t\t\t\t</th></tr></thead><tbody><tr><td>\r\n\t\t\t\t\t\t$30.13\r\n\t\t\t\t\t</td><td><span class=\"neg\">-0.13</span></td><td>\r\n\t\t\t\t\t\t32.75 M\r\n\t\t\t\t\t</td><td>\r\n\t\t\t\t\t\t$252.77 B\r\n\t\t\t\t\t</td></tr></tbody></table></div><div class=\"controls\" data-module-name=\"FirstGlanceControlsModule\"><em>Data as of February 15, 2012 01:59:59 PM ET</em><div><button class=\"type-1\"><span>Add to Watchlist</span></button><button class=\"type-2\"><span>Trade</span></button></div></div></div>"}

知道如何进行这项工作吗?谢谢。

【问题讨论】:

  • 你对结果做了什么让空格随之而来很重要?
  • 其实不管什么原因,用string.Replace或者类似的方法去掉所有的制表符、换行符和回车应该是微不足道的。
  • 数据带宽量等...另外,我不确定使用 string.Replace() 是否会在所有字符串操作都在后台进行时更慢。
  • 是的,但这就是框架呈现视图的方式。除非您想编写自己的代码来执行此操作,否则您可能会被困在对结果进行字符串操作。

标签: c# asp.net-mvc asp.net-mvc-3 razor


【解决方案1】:

基于此SO question,似乎 string.Replace 和大字符串存在问题,因为它们是不可变的,但 StringBuilder 即使在大字符串上也应该可以正常工作。

public virtual ActionResult RenderToString()
{
    string html = RenderRazorViewToString(MVC.Markets.Views._RenderToString);
    html = new StringBuilder(html)
        .Replace("\n","")
        .Replace("\r","")
        .Replace("\t","")
        .ToString();
    return Json(new { html = html }, JsonRequestBehavior.AllowGet);
}

根据需要添加任何其他空白字符。

【讨论】:

  • 谢谢戴夫,这可以解决问题。
【解决方案2】:

由于视图应该返回有效的 XML,您可以尝试使用以下内容:

public virtual ActionResult RenderToString()
{
    var html = RenderRazorViewToString(MVC.Markets.Views._RenderToString);
    string clean = XElement.Parse(html).ToString(SaveOptions.DisableFormatting);
    return Json(new { html = clean }, JsonRequestBehavior.AllowGet);
}

或者还有另一个巧妙的选择here on SO

【讨论】:

  • 嗨@Tr1stan,这有点帮助,但仍然有很多“\r\n\t”...,即:{“html”:“

    \r\n\t\t\tMicrosoft Corp (MSFT:纳斯达克)

猜你喜欢
  • 2018-03-14
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
  • 2013-06-03
  • 1970-01-01
  • 2012-05-29
相关资源
最近更新 更多