ASP.NET MVC中反斜杠丢失问题求助
解决ASP.NET MVC Razor视图中文本框丢失反斜杠的问题
我之前也碰到过一模一样的情况——数据库里存的反斜杠明明没问题,页面源码里也能看到,但文本框就是显示不出来。这其实是浏览器解析<input>的value属性时,会把单个反斜杠当成转义字符处理(哪怕是普通的\也会被忽略),所以我们得确保渲染到页面的HTML里,反斜杠是转义后的双重反斜杠(\\),这样浏览器才会显示成单个反斜杠。
下面是几种可行的解决方案:
方案一:用TextBoxFor配合Html.Raw手动指定值
EditorFor会自动对模型值做HTML编码,虽然反斜杠本身不是HTML特殊字符,但架不住浏览器误解析。换成TextBoxFor并手动设置value为Html.Raw处理后的内容,就能绕开这个问题:
@Html.TextBoxFor(model => model.ProductDetailVM.ControlValue, new { @Value = Html.Raw(Model.ProductDetailVM.ControlValue.Replace("\\", "\\\\")) })
这里先把模型里的单个反斜杠替换成双重反斜杠,再用Html.Raw避免Razor二次编码,生成的HTML里value属性就会是"test\\test",浏览器显示时就会变成test\test。
方案二:在ViewModel中处理值(更优雅的方式)
要是不想在视图里写复杂的替换逻辑,可以把转义逻辑放到ViewModel的属性里:
public class ProductDetailVM { private string _controlValue; // 渲染时返回双重反斜杠,提交时转回单个反斜杠 public string ControlValue { get => _controlValue?.Replace("\\", "\\\\"); set => _controlValue = value?.Replace("\\\\", "\\"); } // 其他属性... }
这样视图里还是用原来的EditorFor就行:
@Html.EditorFor(model => model.ProductDetailVM.ControlValue)
ViewModel的getter会把数据库里的单个反斜杠转成双重反斜杠,渲染后浏览器能正确显示;setter则会把表单提交的双重反斜杠转回单个,保证存入数据库的值依然正确。
方案三:排查模型绑定与全局设置
如果上面的方法都没效果,可以检查这几点:
- 控制器接收模型时,
ControlValue的值是否正确(有没有被自动转义); - 确认没有全局编码过滤器修改了输出内容;
- 要是用的是.NET Framework,检查
web.config里的httpRuntime节点有没有因requestValidationMode导致的编码问题。
最后提醒下:如果用户输入的内容不可信,用Html.Raw要注意XSS风险,建议先对特殊字符做过滤处理。
内容的提问来源于stack exchange,提问作者Danish
相关产品推荐
相关产品推荐

