MVC 将复杂对象传递给操作
MVC passing complex object to action
当用户调用一个我需要将其重定向到另一个并传递一个复杂对象时,我的控制器中有两个操作:
第一次行动:
public virtual ActionResult Index(string Id) {
var input = new CustomInput();
input.PaymentTypeId = Id;
return RedirectToAction(MVC.Ops.SPS.Actions.Test(input));
}
第二个动作:
public virtual ActionResult Test(CustomInput input) {
return View();
}
问题是输入在第二个动作时为空。我该如何解决?
您可以使用临时数据临时保存一个值来解决此问题,第二种方法可以从中检索该值。
public virtual ActionResult Index(string Id)
{
var input = new CustomInput();
input.PaymentTypeId = Id;
TempData["TheCustomData"] = input; //temp data, this only sticks around for one "postback"
return RedirectToAction(MVC.Ops.SPS.Actions.Test());
}
public virtual ActionResult Test()
{
CustomInput = TempData["TheCustomData"] as CustomInput;
//now do what you want with Custom Input
return View();
}
只要使用这样的 .keep() 方法,您就可以让您的 tempData 继续运行,只要它永远不会为 null,
if (TempData["TheCustomData"] != null)
TempData.Keep("TheCustomData");
我想确保您知道 RedirectToAction 创建新的 HTTP 请求,因此这会创建另一个 GET,您可以传递的只是 RouteValueDictionary
对象,它就像具有查询字符串参数,它是键和值的列表对字符串。也就是说,您不能用您的代码方式传递复杂对象,但是@kyleT 提到的 TempData
解决方案将起作用。
根据您的代码,我的建议是避免执行两个操作并相互重定向,除非您做的事情比您在问题中提到的要多。或者你可以让你的 Test
动作接受 id
参数,你的 Index
动作将只包含 RedirectToAction
传递 id 作为路由参数。
编辑:
另外,如果你没有原始属性,你可以像下面这样传递你的对象(感谢@Stephen Muecke)
return RedirectToAction("Test",(input);
当用户调用一个我需要将其重定向到另一个并传递一个复杂对象时,我的控制器中有两个操作:
第一次行动:
public virtual ActionResult Index(string Id) {
var input = new CustomInput();
input.PaymentTypeId = Id;
return RedirectToAction(MVC.Ops.SPS.Actions.Test(input));
}
第二个动作:
public virtual ActionResult Test(CustomInput input) {
return View();
}
问题是输入在第二个动作时为空。我该如何解决?
您可以使用临时数据临时保存一个值来解决此问题,第二种方法可以从中检索该值。
public virtual ActionResult Index(string Id)
{
var input = new CustomInput();
input.PaymentTypeId = Id;
TempData["TheCustomData"] = input; //temp data, this only sticks around for one "postback"
return RedirectToAction(MVC.Ops.SPS.Actions.Test());
}
public virtual ActionResult Test()
{
CustomInput = TempData["TheCustomData"] as CustomInput;
//now do what you want with Custom Input
return View();
}
只要使用这样的 .keep() 方法,您就可以让您的 tempData 继续运行,只要它永远不会为 null,
if (TempData["TheCustomData"] != null)
TempData.Keep("TheCustomData");
我想确保您知道 RedirectToAction 创建新的 HTTP 请求,因此这会创建另一个 GET,您可以传递的只是 RouteValueDictionary
对象,它就像具有查询字符串参数,它是键和值的列表对字符串。也就是说,您不能用您的代码方式传递复杂对象,但是@kyleT 提到的 TempData
解决方案将起作用。
根据您的代码,我的建议是避免执行两个操作并相互重定向,除非您做的事情比您在问题中提到的要多。或者你可以让你的 Test
动作接受 id
参数,你的 Index
动作将只包含 RedirectToAction
传递 id 作为路由参数。
编辑: 另外,如果你没有原始属性,你可以像下面这样传递你的对象(感谢@Stephen Muecke)
return RedirectToAction("Test",(input);