用于复杂对象持久性的强类型ViewData

时间:2013-03-12 12:01:37

标签: ajax asp.net-mvc

我正在开发一个ASP.NET MVC系统,您可以在其中单击ajax链接,该链接将打开一个复杂流程的窗口(剑道窗口,但不会影响情况)。为了减少管理的噩梦,我制作了一个ViewModel(我应该这样做),但由于程序的复杂性,这个ViewModel是一个复杂的对象。

根据许多条件(包括但不限于您点击链接的时间,您是谁,您的帐户附加了什么时间表,以及,显然,你在此流程中的先前答案。)

问题在于拥有一个复杂的对象,我不能简单地制作@Html.HiddenFor(o=>o.XXX)。所以我开始寻找替代方案,它带来了一个选项TempData。我真的不是动力学和对象类型的粉丝。我真的很希望强烈输入这个View Model。

最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

以下是使用SessionTempData可能有意义的情况。与流行的看法相反,你可以使这些有点强烈的类型。不像viewmodel,但你可以通过使用扩展方法来避免键链混乱。

例如,不要做这样的事情:

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并存储,然后在将其取出时进行反序列化。无论哪种方式,我认为这会将大量隐藏的字段写入您的视图形式。