MVC通过视图移动数据

时间:2015-03-31 14:11:53

标签: c# asp.net-mvc-5

我想知道在构建要插入数据库的表时,通过视图传递数据的建议最佳做法是什么?

因此,例如,如果您有一个员工Web应用程序,其中您输入的第一个页面是新员工的详细信息,第一个和第二个名称。您输入部门详细信息的第二页。

您可以使用两种不同的模型进行验证等。

因此,当您更新名称模型并重定向到第二个页面视图时,如何在那里传递数据,在更新部门数据时存储数据,然后更新组合模型和/或传递到第三个视图输入第三个视图的联系方式。

我可以通过传递viewbag数据来看到它,但这看起来很糟糕。我遇到的问题是每个视图只能引用一个模型,所以它似乎丢弃了以前的数据。

namespace Next.Controllers
{
    public class NextController : Controller
    {
        // GET: Next
        public ActionResult Index()
        {
            return View();
        }

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

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult NewEmpFirst([Bind(Include = "ID, Forename, Surname")] First NewEmpFirst)
        {
            if (ModelState.IsValid)
            {
                First first = new First
                {
                    ID = 1,
                    Forename = NewEmpFirst.Forename,
                    Surname = NewEmpFirst.Surname
                };
            }

            TempData["first"] = NewEmpFirst;
            return RedirectToAction("NewEmpSecond");
        }

        public ActionResult NewEmpSecond()
        {
            First first = TempData["first"] as First;
            TempData["first"] = first;
            ViewBag.Forename = first.Forename;


            return View(); 
        }


        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult NewEmpSecond([Bind(Include = "ID, Department")] Second NewEmpSecond)
        {
            if (ModelState.IsValid)
            {
                First first = TempData["first"] as First;

                FirstSecond fs = new FirstSecond
                {
                    ID = 1,
                    Forename = first.Forename,
                    Surname = first.Surname,
                    Department = "hello"
                };
            }

            TempData["fs"] = NewEmpSecond;
            return RedirectToAction("NewEmpThird");
        }

        public ActionResult NewEmpThird()
        {
            FirstSecond fs = TempData["fs"] as FirstSecond;

            return View(fs);
        }

    }
}

到目前为止我有什么。数据将从一个视图传递到另一个视图,但是当我引用不同的模型以插入数据时,它似乎只是清空了前一组数据。

1 个答案:

答案 0 :(得分:2)

使用会话变量。更好的是,您可以创建一个类,它将具有您需要收集的所有属性,并将该类的实例保存为会话变量。到达流程的最后一步后,获取已保存的实例并将其保存到数据库中。

,即存储值的类可能如下所示:

public class MySessionValues
{
    public First Employee;
    public Second Department;

    // other steps here ...
}

然后在您的控制器操作中NewEmpFirst使用它而不是Temp

var sessionValues = new MySessionValues();
sessionValues.Employee = first;
Session["MySessionValues"] = sessionValues;

在后面的步骤中,检索已保存的实例并添加新值:

var sessionValues = Session["MySessionValues"] as MySessionValues;
sessionValues.Second = NewEmpSecond; // or any other value you're saving
Session["MySessionValues"] = sessionValues;

你看到了模式。您还可以在MySessionValues类上创建有助于从Session范围存储和检索实例的方法。

如果需要,可以将类放在App_Code文件夹中的文件中,或者在应用程序的根目录中创建Helpers文件夹(与Controllers文件夹相同)。但是,如果您只在该控制器中使用此类,则可以将代码放在与控制器相同的文件中。