我应该如何维护请求之间的状态?

时间:2014-03-12 16:12:32

标签: asp.net-mvc

我正在开发一个包含一系列视图的Web应用程序,这些视图允许用户提交不同的数据,这些数据必须在完成后提交给第三方Web服务。

例如

  

[选择帐户类型] - > [提交用户信息] - > [提交结算   详情]

每个视图都在不同的Controller下生成。

在不同视图之间存储数据的最佳方法是什么?由于MVC是无状态的,我不能将它全部存储在全局对象中,直到我准备提交到Web服务,并且我认为数据库过度,因为我不想将数据存储得比它更长需要提交全部内容。

将数据存储到会话结束之前的最佳方法是什么?将其存储在Session对象中?

3 个答案:

答案 0 :(得分:2)

坚持 MVC

我建议在同一控制器中使用这些链接视图。然后,您可以轻松地在之后的模型中保留早期的模型数据。

例如,您的SubmitBillingDetailsModel模型可能具有SubmitUserInfoModel属性等。

E.g:

public ActionResult SubmitUserInfo (SubmitUserInfoModel model)
{
    return View ("SubmitBillingDetails", new SubmitBillingDetailsModel
        {
            SubmitUserInfoModel = model
        });
}

您甚至可以使用一个模型来表示所有单独的视图,并累积单独视图之间的已发布值。

E.g:

public ActionResult SelectAccountType (CompleteModel model)
{
    return View ("SubmitBillingDetails", model);
}

只需确保使用隐藏字段保留后续视图中的所有值(可能会为整个模型做一个部分操作)。

答案 1 :(得分:2)

最好的方法是将用户数据存储在会话中。 session是服务器跨应用程序针对每个用户会话保存的数据字典。因此,用户完成的任何活动(包括用户详细信息)都必须存储在会话中,这样您就可以在不同的视图控制器操作中访问应用程序中的任何位置。

MVC为您提供了使用模型绑定技术的优势,该技术允许您跨应用程序访问不同控制器操作中的会话变量。

例如登录.....

  1. 将用户存储在会话中
  2. 创建模型绑定器
  3. 在global.asax中注册
  4. 在整个应用程序的任何位置访问它,如简单参数。
  5. 享受
  6. *********************登录管理员********************

    public ActionResult Login(LoginModel model, string returnUrl)
    {
        //store use object in session once
        Session["UserProfile"] = user;
    }
    

    *******************创建模型活页夹************************* *

     public class UserModelBinder:IModelBinder
        {
             private const string sessionKey = "UserProfile";
    
            public object BindModel(ControllerContext controllerContext,
                ModelBindingContext bindingContext) {
    
                // get the Cart from the session 
                    EntityUserProfile User = (EntityUserProfile)controllerContext.HttpContext.Session[sessionKey];
                // create the Cart if there wasn't one in the session data
                    if (User == null){
                        User = new EntityUserProfile();
                        controllerContext.HttpContext.Session[sessionKey] = User;
                }
                // return the cart
                    return User;
            }
        }
    

    *******************在global.asax中注册模型绑定器***************

    protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
    
                WebApiConfig.Register(GlobalConfiguration.Configuration);
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
                ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
                ModelBinders.Binders.Add(typeof(EntityUserProfile), new UserModelBinder()); 
            }
    

    ********************访问模型绑定器在申请中的任何地方************** //以下是在我的一个控制器操作中使用模型绑定器的第二个参数

    [HttpPost]
    public JsonResult EmailWorkOrderInvoiceToClient(string OrderNumber, EntityUserProfile user)
     {
          // following is the user object from the session using model binder..
          var myuser=user;
     }
    

答案 2 :(得分:-1)

使用JavaScript localStorage,它是字符串中的键/值对