我正在使用Html.RenderAction在我网站的每个页面上呈现一个常见的登录表单。
如果用户在文本框中输入详细信息并单击“提交”,则会对处理登录的控制器执行POST操作。
如果他们犯了错误,例如输入无效的电子邮件地址,它会在模型状态中填入错误消息,然后重定向回到之前的任何页面。
问题是,因为RenderAction作为单独的请求发生,我正在丢失ViewModel。
即使我把它放入TempData也会丢失,因为TempData会在每个单独的请求中刷新。
有没有办法在连续的Html.RenderAction调用之间保留数据?
如果没有,有关我如何能够破解这个的任何建议吗? (应该将数据放在Session中吗?)
答案 0 :(得分:0)
这就是我暂时所做的。 (这可能不是最理想的解决方案。)
我创建了一个'PreserveViewDataAttribute',我把它放在任何我希望在会话中保留ViewData的动作。
在我的BaseController中,我使用自己的方法覆盖了“重定向”方法,该方法执行以下操作。
获取对调用它的Action方法的引用(这里有点反思)
检查此方法是否定义了“PreserveViewDataAttribute”
如果是,则将当前ViewData复制到Session变量。 (变量的标签与当前操作名称相同,最后加上'_ViewData'。)
在任何一种情况下,都会调用基本的Redirect方法。
然后我在BaseController中创建了一个名为'PreservedViewData'的属性,该属性返回会话中与当前操作相关的ViewData。 (如果没有找到,则返回null)。
因此,为了保留ViewData,只要我想要,我只需要用'PreserveViewDataAttribute'装饰我的动作,然后在需要时调用'PreservedViewData'。
如果您想要源代码,请告诉我。
答案 1 :(得分:-1)
你可能会喜欢Kazi Rashid的这个Post-Redirect-Get部分的方法。
http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx#prg