返回RedirectToAction()不传递对象

时间:2013-10-20 18:21:02

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

我的ASP.NET MVC4应用程序中有两个partialView -

[HttpGet]
public ActionResult Autocomplete_Search(string accountHead, List<LedgerModel> ledge)
{
    if (!String.IsNullOrEmpty(accountHead)) {
        ledge = (from u in db.LedgerTables
                 where u.AccountHead.Contains(accountHead) && u.FKRegisteredRecord == this.LoggedInUser.RegisterID
                 select new LedgerModel {
                     AccID = u.AccID,
                     Place = u.Place,
                     AccountHead = u.AccountHead,
                     DateAccountHead = Convert.ToDateTime(u.DateAccountHead) != null ? Convert.ToDateTime(u.DateAccountHead) : DateTime.Now

                 }).ToList();
        return RedirectToAction("_ProductSearchList", ledge);

    }
    return View();
    //return Json(ledge, JsonRequestBehavior.AllowGet);
}

并 -

public ActionResult _ProductSearchList(List<LedgerModel> ledge) {
            List<LedgerModel> ledger = null;
            if (ledge != null) {
                ledger = (from u in ledge
                         select new LedgerModel {
                             AccID = u.AccID,
                             Place = u.Place,
                             AccountHead = u.AccountHead,
                             DateAccountHead = Convert.ToDateTime(u.DateAccountHead) != null ? Convert.ToDateTime(u.DateAccountHead) : DateTime.Now

                         }).ToList();

                return PartialView(ledge);
            }
            else {
                return PartialView(ledge);
            }
        }

好的,现在当我通过文本框发送字符串时,会调用Action AutoComplete_Search。在重定向到名为_ProductSearchList的另一个方法时,我将listType的对象ledge发送到此方法。但它在ledge操作参数中显示_ProductSearchList null。

但是,此对象是列表类型并包含记录。如何将此对象ledge重定向到操作_ProductSearchList

3 个答案:

答案 0 :(得分:3)

RedirectToAction采用的第二个参数不是模型,而是路径。 这就是为什么你在_ProductSearchList行动中没有收到你期望的结果。

我不太确定这样的东西会起作用,因为我不知道如何在网址中序列化复杂对象列表(或者即使这是推荐的),但这是预期的:

return RedirectToAction("_ProductSearchList", new { ledge = ledge });

要传递列表,您有TempData选项(来自MSDN的引用):

  

动作方法可以将数据存储在控制器的TempDataDictionary中   对象在调用控制器的RedirectToAction方法之前   调用下一个动作。 TempData属性值存储在   会话状态。在之后调用的任何操作方法   设置TempDataDictionary值可以从对象中获取值   然后处理或显示它们。 TempData的值一直持续到它为止   被读取或直到会话超时。在此持久保存TempData   方式启用重定向等方案,因为中的值   TempData可以在单个请求之外使用。

在使用之前,请不要忘记查看Using Tempdata in ASP.NET MVC - Best practice

答案 1 :(得分:1)

在第一个中,您无法在Autocomplete_Search中获取请求中的List ledge。

您无法在重定向时传递复杂对象。您只能传递一个简单的标量值。

在这个帖子中检查答案:

send data between actions with redirectAction and prg pattern

答案 2 :(得分:0)

感谢所有人在这个问题上给予时间。

正如@Damian S所描述的complex object redirecting对我来说是值得注意的建议。

但是,我能够找到最简单的解决方案,以便在DataDictionary中使用C#

我使用TempData[]来管理它,以最简单的方式存储细节,因为它是最精确和最简单的技术。

使用TempData[]

AutoComplete_Search() controller -

中的TempData []中存储记录
TempData["Records"]= ledge;

ProductSearchList控制器

中的用法
List<ledgerModel> ledge= (List<ledgerModel>)TempData["Records"];

解决了我使用methodsmethods对象的问题和头痛。