mvc 提交Html内容的处理
默认
方法1
[ValidateInput(false)]
这个方法会完全开放,对于有些字段允许,有些字段不允许的情况,是不会检测的
方法2
[AllowHtml]
此方法只有再使用DefaultModelBinder的时候才有效
public ActionResult Index(FormCollection form)
如使用FormCollection是不起作用的。因为FormCollection与具体的Model并无关联
检测不通过,就报错的方式似乎也并不是很友好,如果输入的文本确实需要包含<script标签,那就没法添加成功了
假设允许输入,但是自动传唤成HtmlEncode形式,是否会更好。
可采用自定义ModelBinder的方式
public class MvcHtmlModelBinder : DefaultModelBinder { protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value) { var propertyMetadata = bindingContext.PropertyMetadata[propertyDescriptor.Name]; if (propertyMetadata.RequestValidationEnabled && propertyDescriptor.PropertyType == typeof(string) && value != null && !string.IsNullOrEmpty(value.ToString())) { value = value.ToString() .Replace("<script", "<script") .Replace("</script>", "</script>"); } base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value); } }
在global里
ModelBinders.Binders.Add(typeof(TestModel), new MvcHtmlModelBinder());

这样,当更新Model以后,允许html的,还是html,而不允许html的,进行了Encode。
当我们把这样的数据记录到数据库,再读出来时(比如编辑页面)
允许html的,和我们输入的一致,而不允许html的,读出来的encode后的,和我们输入的是不一致的。
我们希望在Html.TextBoxFor时,可以再转回来
public class MvcHtmlModelMetadataProvider : DataAnnotationsModelMetadataProvider { protected override ModelMetadata GetMetadataForProperty(Func<object> modelAccessor, Type containerType, System.ComponentModel.PropertyDescriptor propertyDescriptor) { var meta = base.GetMetadataForProperty(modelAccessor, containerType, propertyDescriptor); if (meta.RequestValidationEnabled && meta.ModelType == typeof(string)) { if (meta.Model != null && !string.IsNullOrEmpty(meta.Model.ToString())) { meta.Model = meta.Model.ToString().Replace("<", "<").Replace(">", ">"); } } return meta; } }
global里
ModelMetadataProviders.Current = new MvcHtmlModelMetadataProvider();
之后,我们使用类似这样的代码
public ActionResult Index() { var obj = new TestModel { Html = "<script>alert(1)</script>", Text = "<script>alert(1)</script>" }; return View(obj); }
他显示的结果是转回来的
但是,如果你是直接输出
@Model.Text
还是转意过的代码
以上代码只为说明,请勿直接用于生产
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?