在ASP MVC 3中跨视图使用相同的模型视图实例

时间:2012-04-18 13:31:53

标签: asp.net-mvc-3 model-view

我有两个视图:第一个视图有一个表单,在提交时,它会填充模型视图(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
}

2 个答案:

答案 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;

    ....
}