通过ASP MVC中独立于表单模型的通用方法重新发布数据

时间:2011-01-10 17:48:49

标签: asp.net-mvc

这是客户端的请求:在某些情况下,有几种表单不需要身份验证,或者记录的用户完成表单并且会话过期需要很长时间。在这些情况下,他希望在用户通过序列化并将其存储在SQL表中来提交表单时保留数据,然后在用户(重新)登录后,他被重定向到相应的表单并重新填充数据从数据库中检索并反序列化。

问题是他想要在授权代码块中存储,检索和重新发送数据的所有逻辑。我知道如何对数据进行存储,序列化,检索,反序列化以及用户重定向到相应的页面,但我不知道如何使其成为通用的,以便它适用于每个表单上的每个模型。

客户端不希望在表单操作方法中完成此任务的任何代码。例如:

[HttpPost]
[Authorize]
public ActionResult Create(Post post)
{
if (ModelState.IsValid)
{
post.CreatedBy = (Guid)Membership.GetUser().ProviderUserKey;
post.CreateTime = DateTime.Now;

repo.Add(post);
repo.Save();

return RedirectToAction("Index");
}
else
{
return View(post);
}
}

正如您所见,他希望尽可能保持清洁。他有这个建议:

  

服务器以RAW文本格式接收HTTP请求。使用此文本,它构建对象(RequestContext,FormCollection集合等)。所以,你应该能够建立一个钩子,例如保存原始请求。成功登录后,可以在处理中注入此HTTP请求的原始文本。

我真的不知道如何做到这一点,即使在MVC中也是如此。 如果有人可以提供帮助,我将非常感激。

谢谢, ABTeam

2 个答案:

答案 0 :(得分:2)

执行此操作的正确方法是捕获用户在数据库中的进度,并提供将其返回到流程中下一步的机制。这可以通过URL中的?step=n参数来完成。如果用户被注销,他们可以重新登录并返回到该过程中的正确步骤。

您的客户在授权代码块中执行此操作的请求不适合使用功能。这不是授权块的目的,并且尝试以客户端描述的方式在那里进行业务逻辑,几乎肯定会危及安全性并导致无法维护的代码。

答案 1 :(得分:0)

授权块不适合它,但您可以通过动作过滤器做一些相当通用的事情。

在OnActionExecuting中加载保存的数据。我不确定你是否能够将它作为参数传递给action方法,但至少你应该能够将它添加到ViewData中,以便它可以作为生成模型的起点。表单页面。

在ActionExecuting之前不确定该模型是否可用于保存,但如果不是在操作方法运行后存在的模型应该是一个合适的替代方案。