You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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&#39;S
  • 如果是通过接口获取的,确认接口返回的是原始字符串而非编码后的内容

如果数据源本身就被编码了,那即使辅助方法处理,也会出现显示异常。

为什么直接在视图用Encode/Decode没用?

因为FormFieldFor内部已经对模型值做了一次HTML编码,如果你在视图里先调用Html.Decode,传给辅助方法后它又会再编码一次,相当于做了无用功,最终还是会显示转义后的实体。

内容的提问来源于stack exchange,提问作者Madhu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:11:16