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

C# 在多个视图上处理模型数据的最佳方法?,c#,asp.net-mvc,session-variables,C#,Asp.net Mvc,Session Variables,我知道有人以几种不同的方式问过我,但我不确定有人问过我的具体问题。由于业务规则,我不能使用db在视图之间临时存储数据。静态变量已输出(多用户)。我试图避免会话和临时数据。如果我使用Viewstate,我将存储大约9-12个模型的数据,这将降低页面加载速度。我有多页表单,如果用户返回表单,则需要重新填充这些表单。我知道这不是一种理想的方法,但是有人能为会话变量以外的多个模型提供一种持久化数据的方法吗?我假设每个视图都需要重新写入Tempdata。我不能提供代码,我知道这不是一个好的设计,但规则是紧

我知道有人以几种不同的方式问过我,但我不确定有人问过我的具体问题。由于业务规则,我不能使用db在视图之间临时存储数据。静态变量已输出(多用户)。我试图避免会话和临时数据。如果我使用Viewstate,我将存储大约9-12个模型的数据,这将降低页面加载速度。我有多页表单,如果用户返回表单,则需要重新填充这些表单。我知道这不是一种理想的方法,但是有人能为会话变量以外的多个模型提供一种持久化数据的方法吗?我假设每个视图都需要重新写入Tempdata。我不能提供代码,我知道这不是一个好的设计,但规则是紧缩


谢谢。

我认为使用Session没有任何问题,即使是MVC。这是一种工具,需要时就使用它。我发现大多数人倾向于避免会话,因为代码通常非常难看。我喜欢在会话中需要存储的对象周围使用通用包装器,这些对象提供强类型和可重用的类(示例):

创建你的具体类型:(真的很简单?)


为什么要避免会话数据?这正是它们的用途……您的视图模型是否可以由页面组成,因此,当用户从一个页面移动到另一个页面时,每个页面都会被填充,并且如果用户返回一个页面,您会将整个模型传递到这些页面,您会从您的模型填充它。我在这里使用@kadumel。我倾向于使用单例模式,在会话存储上使用静态来编译,比如。。。最后提交到数据库之前的向导步骤。这就是会话存储的用途。如果您绝对不能使用会话的原因不明,我们可以考虑使用HTML5存储W/JSON,但我不会推荐它,由于浏览器的限制和变化的标准在其中实施至今。
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();
  }
}