2

これは、コードが必要な問題ではなく、アーキテクトの問題です。

特定のプロジェクトのステータスを表示する必要があるページがあります。簡潔にするために、Open と Closed の 2 つの状態があるとしましょう。

プロジェクトが開いているときに、1 セットの詳細を示す PartialView を表示したいと考えています。プロジェクトがクローズされている場合、異なる詳細を持つ PartialView を表示したいと思います。

今、私は aspx でチェックを行い、どちらか一方をレンダリングできることを知っていますが、aspx コード内の決定ポイントの数を削減しようとしています。aspx 内には最小限の実際のコードが必要だと思います。

また、状態が 2 つ以上あるため、「if」ステートメントが積み重なって面倒になります。

誰かがこのようなことに取り組んだことがありますか?

これを行うにはヘルパーを作成する必要がありますか? これを行う方法がわかりませんが、ビューの ActionResult でこれを処理できますか? たとえば、アクションの結果で PartialViews をレンダリングし、それを通常のビューの一部として返すことはできますか?

4

3 に答える 3

7

コントローラーでロジックを実行し、レンダリングするパーシャルの名前を含む ViewData 値を定義できます...したがって、コントローラーで、

if (Project.Status == "Open") {
    ViewData["StatusPartial"] = "OpenPartial";
} else {
    ViewData["StatusPartial"] = "ClosedPartial";
}

次に、aspxで次のようにします

<%=Html.RenderPartial(ViewData["StatusPartial"]) %>
于 2009-12-14T00:34:03.067 に答える
5

プロジェクトのステータスをとしてコーディングすると、この巧妙なトリックEnumを使用して、どの時点でもif句なしで表示される正しいパーシャルを実際に取得できます。

<% Html.RenderPartial(Enum.GetName(typeof(ProjStat), prj.Status) + 'Partial'); %>

上記の例では、の名前がであり、2つのステータス値とに対応する部分ビューの命名規則があるとEnum想定しています。ProjStatOpenPartial.ascxClosedPartial.ascxOpenClosed

于 2009-12-14T00:49:24.497 に答える
4

@Chris Gutierrez のソリューションが気に入っていますが、ViewData の名前付きエントリではなく、ViewModel のプロパティを使用します。これをコントローラーの Map と組み合わせて、コードを少し節約できます。サンプルでは、​​Status.Open が 0 にマップされ、Status.Closed が 1 にマップされると想定しています。

private readonly static string[] StatusViews
     = new string[] { "OpenPartial", "ClosedPartial" };

...
model.StatusView = StatusViews[(int)Project.Status];


<%= Html.RenderPartial( Model.StatusView ) %>
于 2009-12-14T02:13:44.743 に答える