我想知道在构建要插入数据库的表时,通过视图传递数据的建议最佳做法是什么?
因此,例如,如果您有一个员工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);
}
}
}
到目前为止我有什么。数据将从一个视图传递到另一个视图,但是当我引用不同的模型以插入数据时,它似乎只是清空了前一组数据。
答案 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
文件夹相同)。但是,如果您只在该控制器中使用此类,则可以将代码放在与控制器相同的文件中。