存储模型是会话。有没有更好的方法呢?

时间:2011-12-16 21:19:43

标签: asp.net-mvc-3

我有一个类似于以下的模型类

public class ProductModel
{
    string ProductName { get; set; }
    int Quantity { get; set; }
}

在Controller中我有一个Action项

public ActionResult ShowProduct()
{
      return View();
}

在我看来,用户有两个文本框;他们输入产品名称和数量。他们第一次进入这个页面时这些字段是空的。一旦他们在这些文本框中输入值,他们就会点击“下一步”按钮,将其带到下一页,他们必须输入有关订单的其他信息。 在那个页面上,我有一个后退按钮,他们可以回到第一页。问题是我需要显示他们在第一页输入的信息,但在第二页上我不再拥有该ProductModel。我可以在会话中存储该模型,但不确定在MVC中是否有更好的模式

3 个答案:

答案 0 :(得分:1)

我会避开Session和TempData。如果你正在使用MVC,并且你的视图被完全回发分开,(而不是Ajax)也许你可以在不同的控制器动作中使用视图模型模式。

public class OrderController : Controller
{
    public ActionResult ShowProduct()
    {
        return View(new ProductViewModel());
    }

    [HttpPost]
    public ActionResult DoOrderStuff(ProductViewModel vm)
    {
        if (ModelState.IsValid)
        {
            // OrderViewModel would contain some product data 
            // to be used in the DoOrderStuff view
            return View(new OrderViewModel(vm));
        }

        // error, go back to Page 1
        return View("ShowProduct", vm);
    }
}

这为您提供了验证空间,同时仍然遵循您所描述的向导样式视图。

警告我刚刚意识到这一点:

如果您有一堆连续的视图,那么您的用户体验可能会受到影响,而不会对不同的视图模型进行大量的黑客攻击。例如。客户位于向导的第5页,并希望返回到第2页 - 我最简单的答案将无法满足要求。但是,通过对所有屏幕中的值进行良好的抽象,可以完成。

答案 1 :(得分:0)

这几乎就是Session字典的用途。您可以考虑使用TempData,但实际上它只是Session的轻量级版本。我对你正在做的事情没有任何看法。

答案 2 :(得分:0)

我认为你不需要将它存储在Session / TempData中(注意,TempData的工作原理出乎意料地从MVC 2改为MVC 3)。你的下一个按钮听起来像一个POST,然后你做一些重定向。相反,如果您将表单POST发送到下一个要显示的URL,则ProductModel将一直传递,然后您可以通过Model或ViewData将其从Action传递给View。