繁体   English   中英

将Razor View渲染为字符串会导致额外的格式标签(制表符,换行符)? 如何删除?

[英]Render Razor View as string resulted in extra formatting tags (tabs, line-breaks)? How to remove?

我已经问过这个问题,作为对另一篇文章的评论,但无法使其正常工作。 我正在使用RenderRazorViewToString()方法 ,但是以某种方式返回的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"}

我尝试添加此处概述的扩展方法以使用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>"}

对如何进行这项工作有任何想法吗? 谢谢。

基于这个SO问题 ,看来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);
}

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

由于视图应该返回有效的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);
}

或者在SO上还有另一个整洁的选择

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM