2

我正在我网站的每个页面上使用 Html.RenderAction 呈现一个常见的登录表单。

如果用户在文本框中输入他们的详细信息并单击“提交”,它会向处理登录的控制器发出 POST。

如果他们犯了错误,例如输入了无效的电子邮件地址,它将在 ModelState 中填充错误消息,然后重定向回他们之前所在的任何页面。

问题是,因为 RenderAction 作为单独的请求发生,我丢失了 ViewModel。

即使我将它放入 TempData 它也会丢失,因为 TempData 在每个单独的请求中都会被刷新。

有没有办法在连续的 Html.RenderAction 调用之间保存数据?

如果没有,关于我如何破解这个的任何建议?(应该把数据放在Session中?)

4

2 回答 2

0

这是我暂时所做的。(这可能不是最理想的解决方案。)

我创建了一个“PreserveViewDataAttribute”,我将它放在我想在会话中保留 ViewData 的任何操作上。

在我的 BaseController 中,我用自己的方法覆盖了“重定向”方法,该方法执行以下操作。

  1. 获取对调用它的 Action 方法的引用(这里有点反思)

  2. 检查此方法是否定义了“PreserveViewDataAttribute”

  3. 如果是,则将当前 ViewData 复制到 Session 变量。(变量的标签与当前的动作名称相同,并在末尾添加了“_ViewData”。)

  4. 在任何一种情况下,都调用基本 Redirect 方法。

然后我在 BaseController 中创建了一个名为“PreservedViewData”的属性,它在会话中返回与当前操作相关的 ViewData。(如果没有找到,则返回 null)。

因此,要尽可能长时间地保留 ViewData,我只需用“PreserveViewDataAttribute”装饰我的操作,然后在需要时调用“PreservedViewData”。

如果你想要这个的源代码,请告诉我。

于 2009-09-11T05:17:50.940 回答
-1

您可能会喜欢 Kazi Rashid 的 Post-Redirect-Get 部分的方法。

http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx#prg

于 2009-10-24T16:17:04.890 回答