【问题标题】:How to pass results MVC 4如何传递结果 MVC 4
【发布时间】:2014-10-22 17:31:57
【问题描述】:

我有一个表单,它应该将数据传递给下一个表单。我的表格 1 方法:

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

处理程序

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Order(OrderBegin booking)
    {
        if (ModelState.IsValid)
        {
            // Here i want to open a new form view and pass the result (booking) to the new form form
            return View(booking);
        }


        return View(booking);
    }

但是如何在 (ModelState.IsValid) 之后在处理程序中打开一个新视图,同时保留从表单 1 传递的值。

为了让问题更容易理解,我将解释我在做什么。

首先我制作一个表格,您可以在其中选择一个值(例如产品 1) 如果该值有效,我将显示一个新屏幕,用户可以在其中输入他的姓名并查看产品成本(此处需要来自表格 1 的值来计算成本)。提交此表格 2 后,我在数据库中输入数据(我仍然需要来自表格 1 的值)

【问题讨论】:

  • 附带说明,ViewModel 应该代表视图呈现视图所需的一切。我真的建议不要使用 ViewBag,这是将数据传递给视图的一种非常糟糕的方式。
  • 谢谢,我稍后会更改。我将 ViewModels 用于 OrderBegin 顺便说一句。将其从问题中删除以避免混淆
  • 你的那个视图也被强绑定到 form1 中的这个模型
  • 为什么Order2 方法的验证失败?您已经将OrderBegin 的值分配给Order2(例如NextValues.CustomerID = booking.CustomerID;),因此如果您已经为这些属性渲染了输入,它们应该可以正常回传。
  • @StephenMuecke 编辑,我添加了一些字段并用 jquery 将它们隐藏,显然隐藏的字段没有通过。

标签: .net asp.net-mvc asp.net-mvc-4 model-binding


【解决方案1】:

您可以使用 TempData 在请求之间传输对象。 TempData 在内部使用 Session,因此,重定向结束后,会话将被 asp.net mvc 删除。示例:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Order(OrderBegin booking)
{
    if (ModelState.IsValid)
    {
        TempData["_booking"] = booking;
        return RedirectToAction("SomeAction", "SomeController");
    }


    return View(booking);
}

在另一种方法中,在使用它之前,请确保您在"_booking" 键上有此对象,以供示例

public ActionResult SomeAction()
{
    OrderBegin booking = TempData["_booking"] as OrderBegin;
    if (booking != null)
    {        
        // you have a OrderBegin object here, use it
        return View(booking);
    }


    // could return an empty view, or redirect to another place.. 
    return View();
}

【讨论】:

  • 附带说明,使用TempData 的一些缺点是,如果用户决定使用浏览器上的后退按钮,或者如果用户使用多个选项卡,那么您可能会丢失数据用户也可能会丢失数据。
  • 很好,但是如果我在 SomeAction 中使用另一个 ViewModel 我不能通过预订吗?
  • 不,你必须给我治疗才能领导这个。 TempDataIDictionary<string, object>
  • @FelipeOriani 看到我的编辑,表单 2 的验证仍然存在错误
【解决方案2】:

两个简单的选项是在表单 2 上隐藏字段,其中包含表单 1 中的数据或会话值。

了解您是要允许多条路径还是单条路径非常重要。如果用户打开了 3 个选项卡,则表单版本可以有 3 个不同的值,因为每个选项卡都通过您的向导。如果这需要是单一类型的事件(例如电子商务网站的结帐流程),那么它不应该使用表单,因为您不希望它们使用; A 能够更改表单值以使流程无效 B 每个结帐流程都应该是ACID transaction

【讨论】:

    猜你喜欢
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多