在ASP.NET MVC中使用重定向传递复杂对象?

Ban*_*hee 10 .net c# asp.net-mvc controls action

嗨,

我有一个看起来像这样的动作:

[AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Register(AdRegister adRegister, IEnumerable<HttpPostedFileBase> files)
Run Code Online (Sandbox Code Playgroud)

AdRegister是一个复杂的类,我需要将其传递给Register操作中的一个重定向方法,如下所示:

return this.RedirectToAction("Validate", adRegister);
Run Code Online (Sandbox Code Playgroud)

Validate操作如下所示:

public ActionResult Validate(AdRegister adRegister)
Run Code Online (Sandbox Code Playgroud)

我知道我可以传递简单的参数但在这种情况下它是一个复杂的对象.此示例不起作用,adRegister的属性将为null.

这是可能的,如果是这样,怎么样?

最好的祝福

更多信息:注册操作将采用adRegister并对其执行魔术,然后将其发送到Validate操作.Validate操作将向用户返回验证页面.当用户点击授权按钮时,adRgister将从表单中填充,然后发送到vValidate帖子,在那里保存.我已经查看过将adRegister暂时放在缓存或数据库中,但如果我可以简单地将它传递给下一个操作,那就更好了.

Dar*_*rov 17

一种可能性是在查询字符串中传递简单属性:

return RedirectToAction(
    "Validate", 
    new { 
        foo = adRegister.Foo, 
        bar = adRegister.Bar, 
        ... and so on for all the properties you want to send
    }
);
Run Code Online (Sandbox Code Playgroud)

另一种可能性是将它存储在TempData(重定向的生命周期)或Session(ASP.NET会话的生命周期)中:

TempData["adRegister"] = adRegister;
return RedirectToAction("Validate");
Run Code Online (Sandbox Code Playgroud)

然后从TempData中检索它:

public ActionResult Validate()
{
    adRegister = TempData["adRegister"] as AdRegister;
    ...
}
Run Code Online (Sandbox Code Playgroud)

另一种可能性(也是我建议您使用的那种)是将此对象保留在数据存储区的POST方法中:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Register(AdRegister adRegister, IEnumerable<HttpPostedFileBase> files)
{
    ...
    string id = Repository.Save(adRegister);
    return RedirectToAction("Validate", new { id = adRegister.Id });
}
Run Code Online (Sandbox Code Playgroud)

然后在重定向后从数据存储中获取它:

public ActionResult Validate(string id)
{
    AdRegister adRegister = Repository.Get(id);
    ...
}
Run Code Online (Sandbox Code Playgroud)