.NET MVC:如何传递模型并调用RedirectToAction?

32

我有一个视图List.aspx,它绑定到Kindergarten类。

在控制器中:

public ActionResult List(int Id)
{
  Kindergarten k = (from k1 in _kindergartensRepository.Kindergartens
                    where k1.Id == Id
                    select k1).First();

  return View(k);
}

那个有效。

但是这个不行。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(...)
{
  //...
  Kindergarten k = ...
  return RedirectToAction("List", k);
}

我该如何重定向到列表视图,并将k作为模型传递?

谢谢!

4个回答

56

我认为在使用RedirectToAction时不存在ModelBinding。然而,您最好使用TempData集合来存储对象,并在下一个操作中检索它。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(...)
{
  //...
  Kindergarten k = ...
  TempData["KG"] = k;
  return RedirectToAction("List");
}
在您的列表操作中。
public ActionResult List()
{

   Kindergarten k = (Kindergarten)TempData["KG"];
   // I assume you need to do some stuff here with the object, 
   // otherwise this action would be a waste as you can do this in the Add Action
  return View(k);
}

注意:TempData集合仅保留一个后续重定向所需的对象。 一旦您从Add进行任何重定向,TempData [“KG”]将为null(除非您重新填充它)


1
你不应该这样使用MVC。 - eaglestorm
2
这意味着你的操作中有太多的逻辑。业务逻辑应该在一个单独的层(服务)中,你的操作应该调用这个逻辑,然后重定向到适当的视图。如果你的应用程序设计良好,就不应该陷入需要执行上述操作的境地。 - eaglestorm
5
将对象存储在内存中并不意味着你的应用程序设计不良。这种情况是有用途的:https://dev59.com/jkrSa4cB1Zd3GeqPThlg#1664269。虽然这种实现方式可能不是最理想的,但使用它并非根本上是错误的。 - Omar
2
如果MVC允许我们使用RedirectToAction方法将不同控制器的public ActionResult MethodName(Model record)重载发送到,我将很高兴不使用它...但是如果我已经在一个控制器中加载了记录,则不想传递ID并在第二个位置重复工作。TempData为我提供了一个合适的解决方法。谢谢。 - Mike_Matthews_II
ModelBinding 在 RedirectToAction 上确实会发生。 - ManxJason
当多个网站实例被负载均衡时,理论上每个请求可能到达不同的实例。在这种情况下,存储本地状态是一个不好的想法。最好将其作为参数传递或共享。 - Illidan

27
我认为你只需要像这样调用视图:

return RedirectToAction("List", new {id});

使用id填充幼儿园即可。

18

我不确定你是否想调用 RedirectToAction,因为那只会导致k再次被设置。

我认为你想调用 View 并传入视图的名称和你的模型。

return View("List", k);

哦,但是如果视图在另一个控制器上怎么办? - Aximili
当它正在寻找视图时,它会检查 View\Controller\ 文件夹,如果在那里找不到,它会检查 Shared 文件夹。如果您想跨多个控制器访问视图,请将其放入 Shared 文件夹中。 - Brandon
另外,我没有测试过这个,但我想你也可以尝试直接给它一个路径:return View("~/Views/Controller/List.ascx")。虽然我认为使用共享文件夹更可取。 - Brandon
2
这是正确的,但URL仍将显示“Add”,而不是“List”。 - friggle
2
此外,这违反了Post-Redirect-Get模式。如果在返回视图后刷新页面,则会重新发送原始的Post请求,这可能会导致问题。 - big_tommy_7bb

1
正如Brandon所说,你可能想使用return View("List", Id),但你遇到的问题是你正在将k,即你的模型,传递给一个接受int作为参数的方法。
RedirectToAction想象成一个方法调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接