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

Axi*_*ili 32 asp.net-mvc asp.net-mvc-2

我有一个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);
}
Run Code Online (Sandbox Code Playgroud)

这样可行.

但事实并非如此

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

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

谢谢!

Oma*_*mar 56

使用RedirectToAction时,我不相信ModelBinding存在.但是,最好的选择是使用TempData集合来存储对象,并在以下操作中检索它.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(...)
{
  //...
  Kindergarten k = ...
  TempData["KG"] = k;
  return RedirectToAction("List");
}
Run Code Online (Sandbox Code Playgroud)

在列表操作中

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);
}
Run Code Online (Sandbox Code Playgroud)

注意:TempData集合仅保存单个后续重定向的对象.从Add添加任何重定向后,TempData ["KG"]将为null(除非您重新填充)

  • 将对象存储在内存中并不意味着您的应用程序设计不合理.有用例:http://stackoverflow.com/a/1664269/160823.在这个确切的实现中它可能不是理想的,但它本身并不是不正确的. (5认同)
  • 这意味着你的行动中有很多逻辑.业务逻辑应位于单独的层(服务)中,您的操作应调用此逻辑,然后重定向到适当的视图.如果你的应用程序设计得很好,你不应该进入你需要做的上述位置. (2认同)
  • 如果MVC允许使用`RedirectToAction`方法发送到不同控制器的`public ActionResult MethodName(Model record)`重载,我很乐意不使用它...但如果我已完成加载的工作在一个控制器中记录,我不想传递ID,然后在第二个位置重复工作.TempData为我提供了一个合适的解决方法.谢谢. (2认同)

Ash*_*ish 27

我想你只需要调用视图就好了

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

有身份证你需要填写幼儿园.


Bra*_*don 18

我不确定你是否打算打电话,RedirectToAction因为这只会导致k再次被设置.

我想你想要调用View并传递视图和模型的名称.

return View("List", k);
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的,但URL仍然会说Add,而不是List. (2认同)
  • 此外,这违反了Post-Redirect-Get模式.如果在返回视图后刷新页面,则重新发送原始帖子,这可能会导致问题. (2认同)