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
还是转意过的代码
以上代码只为说明,请勿直接用于生产
mvc 提交Html内容的处理的更多相关文章
- Mvc 提交表单的4种方法全程详解
一,MVC HtmlHelper方法 Html.BeginForm(actionName,controllerName,method,htmlAttributes){} BeginRouteForm ...
- C# MVC提交表单的四种方式(转)
Mvc 提交表单的4种方法全程详解(转) 一,MVC HtmlHelper方法 Html.BeginForm(actionName,controllerName,method,htmlAttribu ...
- Mvc 提交表单的4种方法
一,MVC HtmlHelper方法 1. Html.BeginForm(actionName,controllerName,method,htmlAttributes){} 2. ...
- 【总结-前台发送后台接收表单】MVC提交表单的四种方式
https://www.cnblogs.com/chenwolong/p/Form.html#commentform 后台控制器接收前台表单参数三种方法: 一.普通参数 HTML标签name 和参数名 ...
- Atitit 发帖机实现(3 )---usrQBN023 js提交ajax内容到后端规范与标准化
Atitit 发帖机实现(3 )---usrQBN023 js提交ajax内容到后端规范与标准化 大段内容务必要替换转义换行符号1 提交务必使用utf编码,否则解码后的可能缺失,是web serv ...
- git push 报504 (因提交文件内容过大而失败的解决方案)
Enumerating objects: 60, done. Counting objects: 100% (60/60), done. Delta compression using up to 4 ...
- 编写HTML表单提交并接受数据信息(获取用户通过表单提交的内容)
MyInfoForm.java package com.fxl; import java.io.IOException; import java.io.PrintWriter; import java ...
- asp.net mvc 提交model 接收不了
[HttpPost] //[ValidateInput(false)] public ActionResult AddNews1(_54Young_News_Model.m ...
- Git 提交修改内容和查看被修改的内容
我们将仓库里的readme.txt文件修改一下,改成如下内容: Git is a distributed version control systemGit is free software. 运行g ...
随机推荐
- IocPerformance 常见IOC 功能、性能比较
IocPerformance IocPerformance 基本功能.高级功能.启动预热三方面比较各IOC,可以用作选型参考. Lamar: StructureMap的替代品 Lamar 文档 兼容S ...
- C#深入浅出获取时间DateTime
首先,先了解微软.net里面的DateTime的DateTime.Now.DateTime.Now.Date.DateTime.Now.Day.DateTime.Now.DayOfWeek.DateT ...
- 使用FFMpeg命令行录屏推rtmp流
最近在做局域网内屏幕分享方面的东西,要把录制一台设备的屏幕然后实时推送给内网的一个或多个用户. 做了很多实验,效果还没有达到要求,这里分享一下推rtmp流的实验. 实验使用到的各种工具:FFmpeg. ...
- Validation failed for one or more entities. See ‘EntityValidationErrors’ property for moredetails[转]
这里给大家介绍一个Exception类,让我们能够轻松的知道具体的哪一个字段出了什么问题. 那就是 System.Data.Entity.Validation.DbEntityValidationEx ...
- powerviot install in sharepoint 2013
1.在app server安装powerviot for sharepoint,然后进行配置powerviot 2.powerviot配置之前需要设置security token service以及e ...
- 《Python绝技:运用Python成为顶级黑客》 用Python刺探网络
1.使用Mechanize库上网: Mechanize库的Browser类允许我们对浏览器中的任何内容进行操作. #!/usr/bin/python #coding=utf-8 import mech ...
- hdoj2604 Queuing(矩阵快速幂)
此题如果直接利用递推关系,处理不好会超内存的. 首先找出递推关系式,先给出递推关系式:( L )=( L - 1 ) + ( L - 3 ) + ( L - 4 ):可以先尝试推导一下,推不出来再看下 ...
- Java 反射机制系列
http://www.cnblogs.com/KingIceMou/category/1034898.html
- Nginx+Tomcat搭建负载均衡
一. 工具 nginx-1.8.0 apache-tomcat-6.0.33 二. 目标 实现高性能负载均衡的Tomcat集群: 三. 步骤 1.首先下载Nginx,要下载稳定 ...
- fullpage.js与animate.css搭配使用
jquery的fullpage.js插件的使用 https://alvarotrigo.com/fullPage/#3rdPage 官网 https://github.com/alvarotrig ...