MVC将复杂对象传递给动作

时间:2015-01-15 09:27:08

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

当用户调用一个我需要将其重定向到另一个并且传递一个复杂对象时,我的控制器中有两个动作:

第一个动作:

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

问题是输入在第二个动作时到达null。我怎么解决呢?

2 个答案:

答案 0 :(得分:2)

您可以使用临时数据来解决此问题,以临时保存第二个方法从中检索该值的值。

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一直运行,

    if (TempData["TheCustomData"] != null)
        TempData.Keep("TheCustomData");

答案 1 :(得分:0)

我想确保您知道RedirectToAction创建了新的HTTP请求,因此这会创建另一个GET,您可以传递的所有内容都是RouteValueDictionary对象,就像拥有查询字符串参数一样,这些参数是键和值对的列表串。也就是说,你不能用你的代码方式传递复杂的对象,但是@kyleT提到的TempData解决方案会起作用。

根据您的代码,我的建议是避免执行两个操作并相互重定向,除非您执行的操作超出了您在问题中提到的内容。或者,您可以使Test操作接受id参数,Index操作仅包含RedirectToAction,将id作为路由参数传递。

编辑: 此外,如果您没有原始属性,您可以传递您的对象,如下所示(感谢@Stephen Muecke)

return RedirectToAction("Test",(input);