2011-11-14 128 views
1

我有控制器,它得到钥匙的名单,我想将它们传递到另一个控制器动作:asp.net MVC 3传递参数

public class DocumentController : Controller 
    { 
     private List<DocumentKey> _keys = new List<DocumentKey>(); 

     [HttpPost] 
     public ActionResult Send(Document doc, IEnumerable<HttpPostedFileBase> file) 
     { 
      ... 

      _keys = getKeys(); 

      return RedirectToAction("Status", "Home", _keys); 
     } 

我尝试使用

return RedirectToAction("Status", "Home", _keys); 

return RedirectToAction("Status", "Home", new {keys = _keys}); 

但是在状态键中总是为空或者计数为0.

public class HomeController : Controller 
    { 

     public ActionResult Status(List<DocumentKey> keys) 
     { 
      return View(keys); 
     } 

我可以通过简单的数据,例如:

return RedirectToAction("Status", "Home", new {key = _keys.First().ToString()}); 
public ActionResult Status(string key) 

工作的,但有一种方式来传递集合?

回答

2

将这种类型的数据作为查询字符串参数传递将不起作用,因为您正试图这样做。如果您需要数据持续到您的下一个请求,将“密钥”推入tempdata可能是可行的。

public class DocumentController : Controller 
    { 
     private List<DocumentKey> _keys = new List<DocumentKey>(); 

     [HttpPost] 
     public ActionResult Send(Document doc, IEnumerable<HttpPostedFileBase> file) 
     { 
      ... 
      TempData["_keys"] = getKeys(); 
      return RedirectToAction("Status", "Home"); 
     } 

public class HomeController : Controller 
    { 

     public ActionResult Status() 
     { 
      List<DocumentKey> keys = TempData["_keys"]; 
      return View(keys); 
     } 
+0

TempData将存储,直到我刷新“状态”页面? –

+0

@andronz - 正确 - tempdata存储在两个连续请求之间,之后它被销毁。 – Jesse

2

RedirectToAction通过向客户端发送HTTP 302进行往返。那真的是你需要的吗?

因为如果你不这样做,那么最简单的方法就是直接调用你的HomeController的Status方法。您还需要更换您的来电查看明确指定视图的名称,即:

public ActionResult Status(List<DocumentKey> keys) 
    { 
     return View("Status", keys); 
    } 

如果确实需要来回,然后一个解决方案是使用TempData的存储数据的建议由杰西。