加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 不引用MVC的AllowHtml属性

发布时间:2020-12-16 04:34:30 所属栏目:asp.Net 来源:网络整理
导读:我们将业务逻辑层和业务对象分离为一个完全独立的项目/程序集.模型的某些属性可以包含 HTML内容.在业务逻辑的前面,我们有一个ASP.NET MVC Web应用程序,用户可以在其中管理业务对象. 要在特定属性上允许HTML内容,我们必须添加AllowHtml属性.但我们不能,因为我
我们将业务逻辑层和业务对象分离为一个完全独立的项目/程序集.模型的某些属性可以包含 HTML内容.在业务逻辑的前面,我们有一个ASP.NET MVC Web应用程序,用户可以在其中管理业务对象.

>要在特定属性上允许HTML内容,我们必须添加AllowHtml属性.但我们不能,因为我们不想在我们的核心项目中引用System.Web.Mvc.
>部分类不能跨多个程序集使用.
>使用MetadataType属性不是一个选项,因为它会导致对MVC的间接依赖或核心层与Web应用程序之间的循环依赖.
>另一个部分解决方案是使用ValidateInput属性关闭整个请求的请求验证,但我们只想关闭特定属性的请求验证.
>属性不是虚拟的,因此我们不能简单地创建派生类型来覆盖特定属性.
>我们不希望复制业务对象以查看具有完全相同属性和元数据的模型.
>覆盖模型绑定逻辑不是一种选择.

那么,我们如何向MVC模型绑定器指出我们想要在(并且仅在)某些特定属性上允许HTML内容,而不在我们的业务逻辑层中引用ASP.NET MVC?或者,如何在没有强引用的情况下从另一个程序集注入元数据?

谢谢.

解决方法

我必须将BindModel更改为以下(这是基于Russ Cam的答案),以便检查实际属性的属性.我也看了 this的答案寻求帮助:
public override object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext)
    {            
        var holderType = bindingContext.ModelMetadata.ContainerType;
        if (holderType != null)
        {
            var propertyType = holderType.GetProperty(bindingContext.ModelMetadata.PropertyName);
            var attributes = propertyType.GetCustomAttributes(true);
            var hasAttribute = attributes
              .Cast<Attribute>()
              .Any(a => a.GetType().IsEquivalentTo(typeof(MyAllowHtmlAttribute)));
            if (hasAttribute)
            {
                bindingContext.ModelMetadata.RequestValidationEnabled = false;
            }
        }

        return base.BindModel(controllerContext,bindingContext);
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读