2

現在、既存のWebフォームアプリケーションをMVCに変換する作業を行っていますが、ページの1つをデザインする方法がわかりません。既存のページは2500行のコードであり、同じ情報のいくつかの異なるビューを表示する役割を果たします。次の例は、このページのほんの一部(ツールバー)ですが、コードの重複を避けるための最善の方法がわかりません。

管理者ビューツールバー:保存、PDF、印刷、スペルチェック、管理ドキュメント、従業員ビューの切り替え

ツールバーのマネージャービュー:保存、PDF、印刷、スペルチェック、従業員ビューの切り替え

ツールバーの従業員ビュー:保存、PDF、印刷、スペルチェック

アプリケーションを3つの異なるビューに分割しました。それらは同じ部分ビューを使用してページのコンテンツをレンダリングしますが、現在、各ビューには独自のツールバーのコピーがあります。そのため、保存、PDF、印刷、スペルチェックのHTML要素が各ビューで複製されます。ツールバーをレンダリングするための部分的なビューがあることが理想的ですが、それを行うには、ビューに何らかのロジックを配置して、[従業員ビューの切り替え]リンクと管理ドキュメントのどちらを表示するかを決定する必要があります。

他の新しいページを開発しているときにも、同様の問題が発生しました。最初に、異なるページの要件には、部分ビューに分割した同じ要素が含まれています。テストして機能を追加した後、最終的には各ページで部分ビューをわずかに変える必要があります。通常、これは特定のコントロールの可視性にすぎませんが、最終的には、部分ビューに一連のロジックが含まれ、いくつかの項目をチェックして、表示する必要があるかどうかを判断します。

ほとんどの要素が同じであるわずかに異なるビューを処理するための最良のアプローチは何ですか?

4

1 に答える 1

3

同じコントロール/部分ビューなどのさまざまな部分を表示または非表示にするアクセス許可の問題である場合は、アクセス許可を確認し、条件付きでさまざまな部分をレンダリングするかどうかを確認するために、1つだけ記述してコードを記述します。このようなもの:

<%@ Control Language="C#" %>

This is the toolbar!!

<div class="fake-css-class">
<%:Html.ActionLink("Save", "Save") %>
<%:Html.ActionLink("PDF", "Pdf") %>
<%:Html.ActionLink("Spell Check", "SpellCheck") %>
<% if (CurrentUser.IsInRole("Admin") { %>
<%: Html.ActionLink("Administrative Documents", "AdminDocs") %>
<%} %>
<% if (CurrentUser.IsInRole("Admin") || CurrentUser.IsInRole("Manager"){
        %>
<%: Html.ActionLink("Employee View Toggle", "EmpView") %>
<%} %>
</div>

<br />
<br />

編集:

ロジックがより複雑になったら、セキュリティコードに関数を追加して、すべてのロジックをモデル/コントローラーに分離し、ビューで単一の関数呼び出しを行うことができるようにします。たとえば、次のようなものです。

public bool Authorize(string controllerName, string actionName) {

            bool authorize = false;

            foreach(var permission in this.permissions) {
                if (permission.Matches(controllerName, actionName)) {
                    authorize = permission.Affirmative;
                }
            }

            return authorize;
        }

このようにして、ビューの外にコードを配置し、ビューに1行のコードを配置することができます。上記のコードは私の現在のプロジェクトから抜粋して例として使用していますが、複雑なロジックを記述してモデルまたはコントローラーに配置できるため、ビューがクリーンに保たれ、ビジネスロジックがそこに配置されません。

于 2012-07-18T15:27:22.590 に答える