ASP.NET MVC中如何修复输入框值的特殊字符编码问题?
解决ASP.NET MVC中FormFieldFor渲染单引号显示为'的问题
这个问题的核心是HTML自动编码在搞鬼——ASP.NET MVC的表单辅助方法(包括你用的FormFieldFor)默认会对输出内容进行HTML编码,以此防范XSS攻击,但这也导致单引号(')被转义成了HTML实体'。下面给你几个可行的解决方案:
方案1:针对原生辅助方法的快速修复
如果FormFieldFor是基于原生TextBoxFor封装的,你可以直接在视图里手动指定输入框的value属性,并用Html.Raw()跳过不必要的编码:
@Html.TextBoxFor(x => x.DisplayName, new { @Value = Html.Raw(Model.DisplayName) })
⚠️ 注意:这种方式只适合可信的数据源(比如你后台硬编码的"Test'S"),如果DisplayName是用户输入的内容,直接用Html.Raw会有XSS攻击的风险。
方案2:修改自定义FormFieldFor辅助方法
如果FormFieldFor是你自己编写的自定义HTML辅助方法,那你需要在方法内部调整编码逻辑,避免双重编码:
public static MvcHtmlString FormFieldFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression) { var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData); // 获取原始值并解码(如果已经被编码过的话) var fieldValue = metadata.Model?.ToString() ?? string.Empty; var decodedValue = HttpUtility.HtmlDecode(fieldValue); // 生成input元素时使用解码后的值 return html.TextBoxFor(expression, new { @Value = decodedValue }); }
这样修改后,辅助方法会先把已编码的实体转成原始字符,再输出到输入框的value属性里。
方案3:检查数据源是否被提前编码
先排查你的DisplayName = "Test'S"赋值逻辑,确认这个值在赋值前没有被提前HTML编码:
- 如果是从数据库读取的,检查数据库里存储的是不是已经转义后的
Test'S - 如果是通过接口获取的,确认接口返回的是原始字符串而非编码后的内容
如果数据源本身就被编码了,那即使辅助方法处理,也会出现显示异常。
为什么直接在视图用Encode/Decode没用?
因为FormFieldFor内部已经对模型值做了一次HTML编码,如果你在视图里先调用Html.Decode,传给辅助方法后它又会再编码一次,相当于做了无用功,最终还是会显示转义后的实体。
内容的提问来源于stack exchange,提问作者Madhu
相关产品推荐
相关产品推荐

