Blazor/Razor/MVC中Html.TextAreaFor特殊字符转义后无法保存如何解决?
问题根因
ASP.NET MVC/Razor 中Html.TextAreaFor辅助方法默认会对绑定的属性值做一次HTML编码处理,若你存储的AnswerText本身就是已经经过HTML编码的内容(例如已将&转为&存储),辅助方法会对内容二次编码,最终展示为&而非预期的&。
你之前尝试的方案错误原因如下:
- 单独定义临时变量
text绑定:生成的textarea标签name属性为text,和模型字段AnswerText不匹配,提交时模型绑定无法正确映射,导致数据无法保存 - 表达式内直接调用
HtmlDecode:TextAreaFor要求绑定参数为成员访问表达式,不支持直接调用方法,因此直接抛出运行异常
可用解决方案
方案1:修正数据存储逻辑(优先推荐)
在数据入库时直接存储原始明文内容,不要提前做HTML编码,仅在前端展示非输入类内容时再做编码处理。此时View层直接使用原有代码即可正常运行:
@Html.TextAreaFor(m => m.AnswerText, new { @class="Textarea", placeholder=Model.QuestionPlaceholder })
TextAreaFor会对原始明文做一次正确编码,提交时也会自动正确映射到模型字段,无兼容问题。
方案2:使用原生textarea标签兼容已编码的存储内容
如果存储逻辑无法修改,必须读取已编码的内容,可以放弃TextAreaFor辅助方法,手动写原生textarea标签,保证name属性和模型字段一致即可:
<textarea class="Textarea" placeholder="@Model.QuestionPlaceholder" name="AnswerText"> @Html.Raw(HttpUtility.HtmlDecode(Model.AnswerText)) </textarea>
HttpUtility.HtmlDecode将存储的已编码内容转回原始明文Html.Raw告诉Razor不要对输出内容二次编码name="AnswerText"保证提交时可以正确绑定到模型字段,不影响保存逻辑
方案3:控制器层提前解码属性值
如果希望继续使用TextAreaFor辅助方法,可以在控制器将模型传给View之前,提前对AnswerText做解码处理:
// 控制器中获取到模型数据后执行 model.AnswerText = HttpUtility.HtmlDecode(model.AnswerText); return View(model);
View层直接使用原有代码即可,展示和提交逻辑都不受影响。
内容的提问来源于stack exchange,提问作者Iria
相关产品推荐
相关产品推荐

