我正在尝试使用Entity Framework在MVC3中创建一个向导。它需要在几个步骤中保持对象的状态(在这种情况下是一篇文章) 我的控制器中有一个静态变量来实例化一篇新文章。在不同的Actions中,我使用TryUpdateModel将表单映射到静态变量。问题是,似乎TryUpdateModel()也更新了数据库。我需要TryUpdateModel来进行自动映射,并更新静态_article变量,但我不希望它持续到数据库直到最后一步!
注意:我知道在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);
}
}
}
答案 0 :(得分:2)
您应该传递一个状态包来保存您在页面之间需要的信息,而不是使用静态变量来保存您的状态信息(这是一个严重的错误)。
答案 1 :(得分:1)
通常,数据实体(映射到数据库的实体)和viewmodel实体(具有该用户的实体)分开使用。当用户在某个步骤之后发布数据时 - 您将TryUpdateModel()
设置为会话对象(特定于用户,而不是所有应用程序作为静态变量)。
最后一步,您将调用业务逻辑方法UpdateModel(viewmodel)
,使用所有已填充的属性更新viewmodel的所有列。