处理多个视图上的模型数据的最佳方式
本文关键字:模型 数据 最佳 方式 视图 处理 | 更新日期: 2023-09-27 18:08:36
我知道有人以不同的方式问过这个问题,但我不确定是否有人问过我的具体问题。由于业务规则的关系,我不能使用数据库在视图之间临时存储数据。静态变量失效(多用户)。我尽量避免使用session和tempdata。如果我使用Viewstate,我将存储大约9-12个模型的数据,这将减慢页面加载速度。我有多页的表单,将需要重新填写,如果用户返回到一个表单。我知道这不是理想的方式,但是谁能建议一种方法来保存这个数据的多个模型,而不是会话变量?我认为每个视图都需要重写Tempdata。我不能提供代码,我知道这不是一个有利的设计,但规则是有限的。
谢谢。
我不认为使用会话有什么错,即使是MVC。它是个工具,需要的时候就用。我发现大多数人都倾向于避免使用Session,因为它的代码通常非常丑陋。我喜欢对需要存储在会话中的对象使用通用包装器,它提供了一个强类型和可重用的类(示例):
public abstract class SessionBase<T> where T : new()
{
private static string Key
{
get { return typeof(SessionBase<T>).FullName; }
}
public static T Current
{
get
{
var instance = HttpContext.Current.Session[Key] as T;
// if you never want to return a null value
if (instance == null)
{
HttpContext.Current.Session[Key] = instance = new T();
}
return instance;
}
set
{
HttpContext.Current.Session[Key] = value;
}
}
public static void Clear()
{
var instance = HttpContext.Current.Session[Key] as T;
if (instance != null)
{
HttpContext.Current.Session[Key] = null;
}
}
}
创建需要存储的类:
[Serializable] // The only requirement
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
创建你的具体类型:(真的真的很容易吗?)
public class PersonSession : SessionBase<Person> { }
在任何你想要的时候使用它,用任何你想要的(只要它是可序列化的)
public ActionResult Test()
{
var Person = db.GetPerson();
PersonSession.Current = Person;
this.View();
}
[HttpPost]
public ActionResult Test(Person)
{
if (Person.FirstName != PersonSession.Current.FirstName)
{
// etc, etc
PersonSession.Clear();
}
}