设置Html的结果.对js字符串的偏置
本文关键字:字符串 js Html 结果 设置 | 更新日期: 2023-09-27 18:09:30
这是我想要完成的一个简化版本:
@{
Thing t = new Thing(); // create an object
IHtmlString TV = Html.Partial("ThingView", t); // get html based on that model
}
<script>
$(function(){
var tv = "@TV"; // hold the html in a js variable
}
</script>
但是我得到一个javascript错误:
SyntaxError: unterminated string literal
var TV = "
我知道问题是Html。部分是用一堆空白生成html,它搞砸了javascript,但似乎应该有一种方式说@TV.NoWhiteSpace()
或其他东西。
我已经搜索了一个解决方案,但我所看到的都是Regex解决方案,这似乎是一个草率的,可能是错误丛生的解决方案。
是否有更干净或更受欢迎的方法来做这件事?
我让JQuery来处理它:
首先,存储html的结果。部分隐藏div:
<div id="T1" style="display:none;">@T1</div>
然后,使用JQuery将div的内容保存到js变量:
var t1 = $("#T1").html();
注意:我只是张贴这个答案,因为我找不到一个更好的地方。我不会把它标记为答案,希望c#能够修复这个明显的疏忽,并且将来有人可以回答这个问题。
使用Html。ToJson:
var value = @(Html.ToJson(value));
在某些情况下我不得不使用JSON。也可以进行解析:
var value = JSON.Parse(@(Html.ToJson(value)));
这里有一篇文章可能会有所帮助:https://iterativo.wordpress.com/2013/04/04/converting-c-razor-models-into-javascript-objects/
尝试:
@{
Thing t = new Thing();
IHtmlString TV = Html.Partial("ThingView", t);
}
<script>
$(function(){
var tv = `@TV`;
}
</script>
伙计们注意到你唯一需要做的就是把@TV变量用引号" ' ' "括起来
试着做:
var tv = "@Html.Raw(TV.ToHtmlString())";
首先调用Html。部分("ThingView"的事情);而不是Html。部分("ThingView",t);无论如何,我使用自定义扩展从视图获取html:
controllerContext.renderViewToString .
这个方法应该在项目中的某处声明:
public static class ViewHelper
{
public static string RenderViewToString(this Controller controller, string viewName, object model)
{
using (var writer = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
controller.ViewData.Model = model;
var viewCxt = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, writer);
viewCxt.View.Render(viewCxt, writer);
return writer.ToString();
}
}
}
使用上面的代码,你可以这样使用它:
@{
var html = Request.ControllerContext.renderViewToString("ThingView", new ThingView())
}
<script>
$(function(){
var t = "@html";
});
</script>