asp.NET MVC3中的向导使用静态对象

时间:2011-06-21 11:45:44

标签: asp.net-mvc entity-framework asp.net-mvc-3 wizard

我正在尝试使用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);
    }


}
}

2 个答案:

答案 0 :(得分:2)

您应该传递一个状态包来保存您在页面之间需要的信息,而不是使用静态变量来保存您的状态信息(这是一个严重的错误)。

答案 1 :(得分:1)

通常,数据实体(映射到数据库的实体)和viewmodel实体(具有该用户的实体)分开使用。当用户在某个步骤之后发布数据时 - 您将TryUpdateModel()设置为会话对象(特定于用户,而不是所有应用程序作为静态变量)。 最后一步,您将调用业务逻辑方法UpdateModel(viewmodel),使用所有已填充的属性更新viewmodel的所有列。