在多个视图上处理模型数据的最佳方法?

xnam 发布于 2019-03-09 c# 最后更新 2019-03-09 14:39 0 浏览

我知道这已经以几种不同的方式提出,但我不确定我的具体问题已被问到。由于业务规则,我不能使用数据库在视图之间临时存储数据。静态变量已超出(多用户)。我试图避免会话和tempdata。如果我使用ViewState,我将存储大约9-12个模型的数据,这将减慢页面加载。如果用户返回表单,我需要重新填充多页表单。我知道这不是理想的方式,但任何人都可以建议一种方法来持久保存这些数据以用于会话变量以外的多个模型? Tempdata需要根据我的设想重新编写。我无法提供代码,我知道这不是一个有利的设计,但规则是有限制的。 谢谢。

已邀请:

ysequi

赞同来自:

我认为使用Session没有任何问题,即使对于MVC也是如此。它是一个工具,在您需要时使用它。我发现大多数人都倾向于避免使用Session,因为代码通常非常难看。我喜欢使用Generic Wrapper来处理我需要存储在会话中的对象,这些对象提供了一个强类型和可重用的类(示例):

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();
  }
}