2

さまざまなビジネス ルールに応じて、コントロールを読み取り専用としてマークするか、無効にするか、完全に非表示にする必要があります。

現在、ビュー モデルの各プロパティに列挙型を渡しています。次に、各コントロールの enum の値を確認します。これにより、Razor のかなり厄介なチャンクが発生しました。s を使用しても@helper、出力はかなり厄介です。

ビジネス ルールに基づいてコントロールの外観を変更するより良い方法があるかどうか疑問に思っています。ほとんどの場合、属性を追加するだけです。最悪の場合、コントロールがまったく表示されません。

4

2 に答える 2

2

表示ロジック/責任はビューの肩にかかっているので...

ルールがユーザーの許可などに依存し、すべてのコントロールに適用できる場合は、ビューモデルごとに 1 つの列挙型で十分だと思います。

それ以外の場合は、問題ありません。私が変更する唯一のことは、ビューモデルのプロパティを表示するためのカスタム拡張メソッドを作成することです。

これらの行に沿ったもの:

    public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, DisplayMode mode)
    {
     // put a switch statement here to either
     // add html attribute for readonly
     // or
     // return null/emptystring
    }

この拡張機能を使用すると、ビューが持つ可能性があります@Html.TextBoxFor(x => x.Prop, Model.PropMode)

これにより、かみそりのビューが少しきれいになります。

また、読み取り専用フィールドの値は引き続き変更される可能性があることに注意してください (開発ツール、firebug)。これは、HttpPost アクションで処理する必要があるものです。

于 2013-03-14T14:32:19.823 に答える
0

これを行うには、XACML (eXtensible Access Control Markup Language - 属性ベースのアクセス制御実装) とポリシー決定ポイントを使用できます。これにより、実際にコントロール/ウィジェットの可視性/有効状態を決定にバインドできます。

approveButton.Enabled = PDPUtil.authorized(Page.User.Identity.Name, purchaseOrderObject);

ポリシーはアプリの外部で定義され、好きなだけ細かく設定できます。

Managers can approve a purchase order if the poLocation == userLocation.

ポリシーは、.NET コントロールだけでなく、さまざまなシステムに適用できます。同じポリシーを HttpModule または WCF メッセージ インスペクターに適用できます。

ここに XACML と C# に関する記事を書きました: http://www.webfarmr.eu/2012/02/fine-grained-access-control-using-xacml-in-c-applications-and-the-net-framework/

http://www.axiomatics.com/policy-decision-points.htmlもチェックしてください

于 2013-03-15T15:19:20.837 に答える