将数据或参数从一个视图传递到另一个视图

时间:2015-05-21 18:04:35

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

我目前的问题包括三个课程,让我们说A,B和C. A类包括B类对象的一个​​属性和C类中的一个属性,在本例中为字符串。 用户应该在没有这两个属性的情况下在第一步中创建类型A的新对象(仅询问其他属性)。应该构建A类型的不完整对象(让它称之为a),并且在下一步中,用户应决定是否要将该对象与现有B或新对象匹配。在做出这个决定之后,将所需的属性添加到a和第三步中,第二个属性将以相同的方式添加并完成它,对象a将保存在数据库中。

我目前的尝试是这样的:

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

    //
    // POST: /A/Create

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(A a)
    {
        if (ModelState.IsValid)
        {
            return RedirectToAction("ViewForB", new { a = a});
        }
        return View(a);
    }
    public ActionResult ViewForB(A a)
    {
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult ViewForB(B b, A a)
    {
        if (ModelState.IsValid)
        {
            bDb.Bs.Add(b);
            bDb.SaveChanges();
            a.propertyForB = b.title;
            return RedirectToAction("ViewForC", new {a = a});
        }
        return View(b);
    }

    public ActionResult ViewForC(A a)
    {
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult ViewForC(C c, A a)
    {
        if (ModelState.IsValid)
        {
            cDb.Cs.Add(c);
            cDb.SaveChanges();
            a.propertyForC = c.title;
            aDb.As.Add(a);
            aDb.SaveChanges();
            return RedirectToAction("Index/");
        }
        return View();
    }

正如你所看到的,我试图将A对象传递给每个下一个视图,但是当在ViewForB中提交时,这不会起作用,因为在这种情况下我不知道如何传递它。 但是在ViewForB中,也会构建B类型的对象,因此我决定以这种方式来验证B的输入是否正确,就像在create方法中一样。

您知道如何将A类型的对象传递到最后一个视图,以便在那里完成并保护它吗?

非常感谢,任何答案都会有所帮助。

1 个答案:

答案 0 :(得分:1)

没有简单的方法来传递"从这个视图到另一个视图的任意对象。当您返回RedirectResult时,您正在向浏览器返回一条指令,要求向下一个URL发送新请求 - 您可以在此包含简单的查询字符串参数,但没有将任意对象序列化为一组的约定查询字符串参数。

您有多种选择:

  1. 将信息存储在Cookie中,并在每个操作中检索它。
  2. 直接从POST操作返回视图,包括已填充字段的隐藏字段,并逐步构建完整模型。
  3. 使用Session或其他一些服务器端存储机制(例如辅助数据库)来保存进度。
  4. 您还可以在重定向中传递单个属性而不是整个模型(您仍然可以在下一个操作中绑定回模型)。这可以用来传递存储在cookie或Session中的模型的密钥,或者 - 如果你只有一些你需要的属性 - 只需单独传递它们:

    return RedirectToAction("ViewForC",
        new { Something = A.SomeProperty, SomethingElse = A.AnotherProperty });