没有传递参数的ASP.NET RedirectToAction

时间:2016-10-19 20:19:53

标签: c# asp.net

我正在尝试使用如下参数执行RedirectToAction:

return RedirectToAction("Index", "CPLCReservation", new { data = cp_sales_app_lc });

我正在尝试将数据传递给CPLCReservation控制器的索引方法。

当我在RedirectToAction上设置断点时,我可以看到填充cp_sales_app_lc,当我转到CPLCReservation控制器的Index方法时:

public ActionResult Index(CP_Sales_App_LC data)
        {
            return View(data);
        }

数据为空。我传递数据错了吗?

cp_sales_app_lc是CP_Sales_App_LC的类变量,其定义如下:

CP_Sales_App_LC cp_sales_app_lc = new CP_Sales_App_LC();

我希望这一切都有道理。

3 个答案:

答案 0 :(得分:1)

RedirectToAction通过HTTP状态代码处理(通常为302)。从HTTP 1.1开始,这些重定向始终通过HTTP动词GET完成。

对象传递给url参数data将不会调用任何序列化代码。 (GET仅处理URL,因此只处理字符串)。您必须序列化您的对象才能将其与RedirectToAction一起使用。

另一个选择是直接调用action方法:

// Assuming both actions are in the CLPCReservationController class
public ActionResult SomeOtherEndpoint() {
    // return RedirectToAction("Index", "CPLCReservation", new { data = cp_sales_app_lc });
    return Index(cp_sales_all_lc);
}

答案 1 :(得分:0)

在这种情况下,您可以将参数捕获为字符串:`

public ActionResult Index(string data)
{
    return View(data);
}

或者您可以执行以下操作:

public ActionResult SomeAction()
{
   TempData["data"]= new CP_Sales_App_LC();
   return RedirectToAction("Index", "CPLCReservation");
}

public ActionResult Index()
{
   CP_Sales_App_LC data = (CP_Sales_App_LC)TempData["data"];
   return View(data);
}

答案 2 :(得分:0)

如果数据是简单的var类型,例如字符串或整数,则可以调用:

return RedirectToAction("Index", "CPLCReservation", new { data = cp_sales_app_lc });

但是,如果您的var很复杂,例如包含许多项目的类,则可以使用use

ViewBag.data = cp_sales_app_lc
return RedirectToAction("Index", "CPLCReservation");

然后在CPLCReservation控制器上调用视图模型

CP_Sales_App_LC data = (CP_Sales_App_LC)ViewModel.data;
return View(data);

传输复杂的模型,如@Vadym Klyachyn所说。

您也可以像这样直接调用操作

return Index(cp_sales_all_lc);

,但是请记住,如果后面有更多代码,它将返回并执行该代码。它不会离开调用它的控制器。

我认为,如果您不需要新的控制器,最好的方法是仅使用与该模型具有相同控制器的新View:

return View("newViewToDisplaydata", cp_sales_all_lc)