我有两个视图:第一个视图有一个表单,在提交时,它会填充模型视图(QuizzModelView)。
现在提交后,我被重定向到另一个视图,该视图也有我想提交的表单。问题是我想为两个视图使用相同的QuizzModelView。这意味着,在提交第二个表单时,我还想提交上一个表单的值。我可以通过创建隐藏的输入来实现这一点,这些输入采用来自第一个视图的值。
有没有隐藏输入的方法。
由于
编辑: 要解释更多:
我的模型视图包含:QuizzModelView.field1,QuizzModelView,。field2
第1步:View1将填写QuizzModelView.field1
第二步:我被重定向到view2
第3步:View2将填写QuizzModelView.field2
现在我希望能够获得QuizzModelView.field1和QuizzModelView.field2。但是我得到了只有QuizzModelView.field2,因为QuizzModelView.field1在提交View2时丢失了
以下是我的行动:
[HttpPost]
public ActionResult TAFPart2PopupEvents(QuizzModelView model)
{
return PartialView("PartialViews/_TAFPart2PopupEvents", model);
}
[HttpPost]
public ActionResult TAFPart3PopupEvents(QuizzModelView model)
{
// here I want to use
// model.field1 and model.field2
}
答案 0 :(得分:0)
如果您希望TAFPart3PopupEvents
操作可以访问数据,则需要将其存储在某个位置。有许多不同的选项(session,querystring,db),但我认为隐藏的输入(通常)是最简单的。
答案 1 :(得分:0)
从技术上(迂腐地),您将无法使用相同的模型实例。但是,您可以将其放入会话中并传递重定向。 Session的优点是不会像隐藏字段那样容易被篡改。另外,您不必为每个步骤实际绑定整个模型 - 只需每个步骤中的单个字段:
[HttpPost]
public ActionResult TAFPart2PopupEvents(string field1)
{
QuizzModelView model = new QuizzModelView();
model.Field1 = field1
Session["Quiz"] = model;
return PartialView("PartialViews/_TAFPart2PopupEvents", model);
}
[HttpPost]
public ActionResult TAFPart3PopupEvents(string field2)
{
var model= (QuizzModelView )Session["Quiz"];
// Fill in field2 here
model.Field2 = field2;
}
编辑:用一些实际细节来解决Brian的评论 -
这种带会话的方法比隐藏字段更容易受到数据篡改的影响,如果这完全是一个问题。使用视图中的隐藏字段,恶意用户可以轻松覆盖以前的数据。根据模型的大小,隐藏的字段可能会使视图膨胀。
会话也有到期的缺点。这是处理过期的简单方法。如果通过Ajax调用它,则必须将错误消息传递回客户端,而不是在那里处理。
[HttpPost]
public ActionResult TAFPart3PopupEvents(string field2)
{
var model= Session["Quiz"] as QuizzModelView;
if (model == null)
{
// Add some kind of message here.
// TempData is like Session, but only persists across one request.
TempData["message"] = "Session Expired!";
return RedirectToAction("Index");
}
// Fill in field2 here
model.Field2 = field2;
....
}