2011-03-23 53 views
10

嗨,在ASP.NET MVC中传递带重定向的复杂对象?

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

[AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Register(AdRegister adRegister, IEnumerable<HttpPostedFileBase> files) 

的AdRegister是一个复杂的类,我需要到一个重定向方法在注册行动进一步向下传递这个,像这样:

return this.RedirectToAction("Validate", adRegister); 

的验证操作是这样的:

public ActionResult Validate(AdRegister adRegister) 

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

这是可行的,如果是这样,如何?

BestRegards

更多信息:注册行动将采取adRegister做就可以了SOM魔法,然后它会被发送到验证行动。 Validate操作将向用户返回一个验证页面。当用户点击授予按钮时,adRgister将从表单中填充,然后发送到vValidate帖子,并保存它。我已经着手将adRegister暂时放入缓存或数据库中,但如果我可以简单地将它传递给下一个操作将会更好。

回答

17

一种可能性将是在查询字符串通过简单的属性:

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

另一种可能性是它(存储在TempData的(用于重定向的寿命)或会话的ASP的寿命.NET会话):

TempData["adRegister"] = adRegister; 
return RedirectToAction("Validate"); 

,然后从TempData的检索:

public ActionResult Validate() 
{ 
    adRegister = TempData["adRegister"] as AdRegister; 
    ... 
} 

另一种可能性(和一个我会建议你)是要坚持在POST方法这个对象在您的数据存储:

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

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

public ActionResult Validate(string id) 
{ 
    AdRegister adRegister = Repository.Get(id); 
    ... 
} 
+0

好的,那么它不可能直接发送复杂的对象到动作。TempData的问题可能是用户刷新页面。 Maby最好的方法是将其存储在数据库中,然后以设定的时间间隔运行清理(用户可以进入第2阶段,然后中止,如果是,数据仍然在数据库中)。 – Banshee 2011-03-23 18:44:55

+0

如果他们在会话中放弃,我猜数据库会更好。 – 2011-03-23 18:45:56

+0

@SnowJim,对于用户刷新页面,您是正确的。这就是为什么我不会推荐你使用它。最好的方法是将其存储在数据库或会话中。 – 2011-03-23 18:46:20

1

一个想法可能会创建一个会话变量,并传递一个引用该会话变量的Key,如果该对象需要acorss几个视图?

+0

是的,可以工作,唯一的问题是,如果用户需要很长时间提交页面,会话可能已被删除。那么将它存储在数据库中会更好。但是届时会议时间可能会被设置为60分钟,这应该足够了。 – Banshee 2011-03-23 18:52:49

+0

如果这个工作流是特定的东西,那需要很长时间,并且需要将会话保持为活动状态,通过周期性的ajax调用保持会话生效会比设置会话超时更好... – 2011-03-23 18:59:46

1

ASP.NET MVC的tempdata应该是完美的。

也就是说,TempData或Session是一个选项,但有一些缺点,比如很违反,通常很模糊或难以调试。最好是将临时值“隐藏”在持久性存储中,例如用户的配置文件或自己的​​数据库,然后通过验证方法传递密钥,然后可以从该存储中加载数据。这也为恢复被遗弃的手推车等提供了可能性。

+0

aha我确实有缓存我可以设置定时器。我可以将对象存储在此缓存中,然后每次ti用户提交将超时更新为60分钟或类似的情况。这意味着我不需要手动清理数据库,并且如果用户做出诸如刷新等奇怪的东西,我仍然可以恢复数据。 – Banshee 2011-03-23 19:00:53

+0

要小心 - 在大多数情况下,ASP.NET缓存比Session存储更加违反。当内存短缺时,它是第一个受到攻击的东西。我将使用缓存上的会话来处理用户数据。 – 2011-03-23 19:02:59