0

私はASP.NETMVCシステムに取り組んでおり、ajaxリンクをクリックすると、複雑なフローのウィンドウ(剣道ウィンドウですが、状況には影響しません)が開きます。これを管理するのが悪夢にならないようにするために、(必要に応じて)ViewModelを作成しましたが、このViewModelは、手順が複雑なため、複雑なオブジェクトです。

多くの条件(リンクをクリックした時間、あなたが誰であるか、アカウントに添付されているスケジュール、そして明らかにあなたのこのフローの以前の回答)。

問題は、複雑なオブジェクトを持っているので、単純に作成できないこと@Html.HiddenFor(o=>o.XXX)です。それで私は代替案を探し始めました、そしてそれは私に単一のオプション、TempDataを導きました。私はダイナミクスやオブジェクトタイプのファンではありません。このビューモデルを強く型付けしてもらいたいのですが。

これに取り組むための最良の方法は何でしょうか?

4

1 に答える 1

0

Sessionorを使用するのが理にかなっている場合がありTempDataます。一般に信じられていることとは反対に、これらをある程度強く型付けすることができます。ビューモデルとは異なりますが、拡張メソッドを使用することでキーチェーンの混乱を回避できます。

たとえば、次のようなことをする代わりに:

TempData["NestedVariable1"] = someObject;
...
var someObject = TempData["NestedVariable1"] as CustomType;

これらの変数を格納する拡張メソッドを記述し、拡張メソッドでキーとキャストをカプセル化できます。

public static class ComplexFlowExtensions
{
    private static string Nv1Key = "temp_data_key";

    public static void NestedVariable1(this TempData tempData, CustomType value)
    {
        // write the value to temp data
        tempData[Nv1Key] = value;
    }

    public static CustomType NestedVariable1(this TempData tempData)
    {
        // read the value from temp data
        return tempData[Nv1Key] as CustomType;
    }
}

次に、次のようにコントローラーまたはビューからこれらの値を読み書きできます。

TempData.NestedVariable1(someObject);
...
var someObject = TempData.NestedVariable1();

と同じパターンを使用することもできますSession。また、個々のスカラー値を個別の変数に保存する代わりに、ネストされたオブジェクト グラフ全体を変数に保存できる必要があります。それか、JSON にシリアル化して保存し、取り出したときに逆シリアル化します。いずれにせよ、これはビューのフォームに書き出された大量の非表示フィールドよりも優れていると思います。

于 2013-03-12T13:00:09.480 に答える