0

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

谢谢你。

4

1 回答 1

1

我认为使用 Session 没有任何问题,即使对于 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();
  }
}
于 2013-04-11T18:09:36.377 回答