【发布时间】:2011-06-21 11:45:43
【问题描述】:
我正在尝试使用实体框架在 MVC3 中创建一个向导。它需要在几个步骤中保持对象(在本例中为文章)的状态。
我的控制器中有一个静态变量,用于实例化一篇新文章。在不同的操作中,我使用 TryUpdateModel 将表单映射到静态变量。问题是,TryUpdateModel() 似乎也更新了数据库。我需要 TryUpdateModel 进行自动映射,并更新静态 _article 变量,但我不希望它在最后一步之前一直保存到数据库中!
N.B:我知道在 MVC 中创建向导有很多可能的解决方案,但我想知道如何才能使这种方式工作,所以请不要替代 MVC 向导模式。
谢谢。
namespace website.Controllers
{
public class ArticlesController : BaseController
{
// private static variable to hold the chosen article in the wizard
private static articles _article = new articles();
/// <summary>
/// Index page shows a list of articles in a webgrid
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
List<articles> _articles = Data.getArticles();
return View(_articles);
}
/// <summary>
/// First page of the article wizard
/// </summary>
/// <returns></returns>
public ActionResult BasicDetails(string id, string nextButton)
{
// back or next doesn't matter - store form values
if (_article != null) TryUpdateModel(_article);
if (nextButton != null)
{
return RedirectToAction("ArticleGroup");
}
else
{
_article = Data.GetArticleById(id);
return View(_article);
}
}
/// <summary>
/// Second page of the article wizard
/// </summary>
/// <returns></returns>
public ActionResult ArticleGroup(string nextButton, string backButton)
{
TryUpdateModel(_article);
if (backButton != null)
return RedirectToAction("BasicDetails");
else if (nextButton != null)
{
return RedirectToAction("Price");
}
else
{
return View(_article);
}
}
/// <summary>
/// Third page of the article wizard
/// </summary>
/// <returns></returns>
public ActionResult Price(string nextButton, string backButton)
{
TryUpdateModel(_article);
if (backButton != null)
{
return RedirectToAction("ArticleGroup");
}
else if (nextButton != null)
return RedirectToAction("LinkedClubs");
else
{
return View(_article);
}
}
/// <summary>
/// Last page of the article wizard
/// </summary>
/// <returns></returns>
public ActionResult LinkedClubs(string backButton)
{
if (backButton != null)
return RedirectToAction("Price");
else
return View(_article);
}
}
}
【问题讨论】:
-
TryUpdateModel不更新任何数据库。这是一个 MVC 特定的方法。它甚至不知道您正在使用数据库。它的作用是将提供的模型与请求参数绑定并应用验证逻辑。现在即使您当前的设计是错误的,您也不想要替代品?您直接在视图中使用域模型,而不是使用视图模型。很抱歉这么说,但我担心这样的设计会非常崎岖不平。在 ASP.NET 应用程序中还保留用户特定状态的静态对象!?怎么回事?如果两个用户同时填写向导会怎样? -
如果我理解正确,您使用的是静态来保存数据。这在我不知道从哪里开始的 Web 应用程序中是非常错误的。如果您有多个用户(并且它是一个网站,因此您将有多个用户),他们最终将共享该静态数据。他们会看到彼此的变化,覆盖彼此的变化,破坏彼此的变化。这将是一个巨大的混乱。
-
谢谢你们。我刚刚开始使用 MVC,我了解到控制器中的静态私有变量是每个会话的容器。当然,如果模式被打破,它会回到绘图板上。无论如何,再次感谢您的提醒。
标签: asp.net-mvc entity-framework asp.net-mvc-3 wizard