我正在开发一个ASP.NET MVC系统,您可以在其中单击ajax链接,该链接将打开一个复杂流程的窗口(剑道窗口,但不会影响情况)。为了减少管理的噩梦,我制作了一个ViewModel(我应该这样做),但由于程序的复杂性,这个ViewModel是一个复杂的对象。
根据许多条件(包括但不限于您点击链接的时间,您是谁,您的帐户附加了什么时间表,以及,显然,你在此流程中的先前答案。)
问题在于拥有一个复杂的对象,我不能简单地制作@Html.HiddenFor(o=>o.XXX)
。所以我开始寻找替代方案,它带来了一个选项TempData。我真的不是动力学和对象类型的粉丝。我真的很希望强烈输入这个View Model。
最好的方法是什么?
答案 0 :(得分:0)
以下是使用Session
或TempData
可能有意义的情况。与流行的看法相反,你可以使这些有点强烈的类型。不像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并存储,然后在将其取出时进行反序列化。无论哪种方式,我认为这会将大量隐藏的字段写入您的视图形式。