渲染cshtml页面时无法读取视图模型中C#对象的问题咨询
问题原因
你在Controller中赋值给HtmlContent的@Model.Name只是普通字符串内容,Razor引擎只会编译解析.cshtml文件中直接编写的@表达式,不会递归解析你动态传入的字符串变量里的Razor语法,所以这部分不会被替换成实际的Name属性值。
可行解决方案
方案1:Controller端直接拼接值(最推荐,性能最高)
直接在Controller构造HtmlContent的时候,就把Name属性值插值到字符串中,不需要把Razor表达式写到字符串里:
public ActionResult Index() { config res = new config(); res.Name = "John"; // 使用C#字符串插值直接把Name值拼入HTML res.HtmlContent = $"<h1>Hi {res.Name} </h1>"; return View(res); }
此时前端直接用@Html.Raw(Model.HtmlContent)就能输出预期结果。
方案2:View端替换自定义占位符
如果你的HtmlContent是从其他地方读取的(比如数据库、配置文件),无法在Controller端提前拼接,可以提前约定占位符标记,在View端做替换:
- 把
HtmlContent里的变量位置改成自定义占位符,比如:
res.HtmlContent = "<h1>Hi {{Name}} </h1>";
- 在View中替换占位符后再渲染:
<div id = "Header">@Html.Raw(Model.HtmlContent.Replace("{{Name}}", Model.Name))</div>
如果有多个占位符,你可以封装一个扩展方法批量替换所有属性值,代码更简洁。
方案3:动态渲染Razor模板(不推荐,仅适用于复杂场景)
如果确实需要支持完整的Razor语法解析,可以引入Razor模板渲染库,将HtmlContent作为动态模板传入渲染,拿到替换后的HTML再输出。但这种方式性能开销大,还会带来额外的依赖,除非有非常复杂的模板渲染需求,否则不建议使用。
注意事项
使用@Html.Raw会直接渲染HTML内容,如果HtmlContent包含用户可控的输入,存在XSS注入风险,需要提前对内容做安全过滤。
内容的提问来源于stack exchange,提问作者Katherine
相关产品推荐
相关产品推荐

