我有一个类似于以下的模型类
public class ProductModel
{
string ProductName { get; set; }
int Quantity { get; set; }
}
在Controller中我有一个Action项
public ActionResult ShowProduct()
{
return View();
}
在我看来,用户有两个文本框;他们输入产品名称和数量。他们第一次进入这个页面时这些字段是空的。一旦他们在这些文本框中输入值,他们就会点击“下一步”按钮,将其带到下一页,他们必须输入有关订单的其他信息。 在那个页面上,我有一个后退按钮,他们可以回到第一页。问题是我需要显示他们在第一页输入的信息,但在第二页上我不再拥有该ProductModel。我可以在会话中存储该模型,但不确定在MVC中是否有更好的模式
答案 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。