mvc 提交Html内容的处理

默认

image

方法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());
image

这样,当更新Model以后,允许html的,还是html,而不允许html的,进行了Encode。

当我们把这样的数据记录到数据库,再读出来时(比如编辑页面)

image

允许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);
}

他显示的结果是转回来的

image

但是,如果你是直接输出

@Model.Text

还是转意过的代码

以上代码只为说明,请勿直接用于生产

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值