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