10

ビジネス ロジック層とビジネス オブジェクトを完全に別のプロジェクト/アセンブリに分離しました。モデルの一部のプロパティには、HTML コンテンツを含めることができます。ビジネス ロジックの前には、ユーザーがビジネス オブジェクトを管理できる ASP.NET MVC Web アプリケーションがあります。

  • 特定のプロパティで HTML コンテンツを許可するには、AllowHtml 属性を追加する必要がありました。しかし、コア プロジェクトで System.Web.Mvc を参照したくないため、それはできません。
  • 部分クラスは、複数のアセンブリで使用できません。
  • MetadataType 属性の使用はオプションではありません。MVC への間接的な依存関係、またはコア レイヤーと Web アプリケーション間の循環依存関係が発生するためです。
  • 別の部分的な解決策は、ValidateInput 属性を使用して、リクエスト全体のリクエスト検証を無効にすることですが、特定のプロパティに対してのみリクエスト検証を無効にしたいと考えています。
  • プロパティは仮想ではないため、単純に派生型を作成して特定のプロパティをオーバーライドすることはできません。
  • ビジネス オブジェクトを複製して、まったく同じプロパティとメタデータを持つモデルを表示したくありません。
  • モデル バインディング ロジックをオーバーライドすることはできません。

では、ビジネス ロジック レイヤーで ASP.NET MVC を参照せずに、特定のプロパティ (およびそのプロパティのみ) で HTML コンテンツを許可することを MVC モデル バインダーにどのように示すことができるでしょうか? または、強い参照なしで別のアセンブリからメタデータを挿入するにはどうすればよいでしょうか?

ありがとうございました。

4

4 に答える 4

7

実際のプロパティの属性を確認するために、BindModel を次のように変更する必要がありました (これは Russ Cam の回答に基づいています)。私も助けを求めてこの答えを見ました:

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);
    }
于 2014-05-28T18:16:29.760 に答える