我们将业务逻辑层和业务对象分离为一个完全独立的项目/程序集.模型的某些属性可以包含
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); }