未传递参数为的ASP.NET RedirectToAction

本文关键字:ASP NET RedirectToAction 参数 | 更新日期: 2023-09-27 18:13:46

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

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

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

当我在RedirectToAction中放置一个断点时,当我转到CPLCReservation Controller的Index方法时,我可以看到cp_sales_app_lc被填充:

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();

我希望这一切都有意义。

未传递参数为的ASP.NET RedirectToAction

RedirectToAction通过HTTP状态代码处理(通常为302(。从HTTP1.1开始,这些重定向总是通过HTTP谓词GET来完成。

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

另一种选择是直接调用动作方法:

// 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);
}

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

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);
}

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

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

但是如果你的var很复杂,比如一个有很多项目的类,你可以使用

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);

但请记住,如果您在它之后有更多的代码,它将返回并执行该代码。它不会离开呼叫它的控制器。

我认为,如果你不需要一个新的控制器,最好的方法是只使用一个新视图,与该型号的控制器相同:

return View("newViewToDisplaydata", cp_sales_all_lc)