【问题标题】:Handle Multiple Form Submission via ActionFilterAttribute mvc3.net通过 ActionFilterAttribute mvc3.net 处理多个表单提交
【发布时间】:2011-11-24 10:24:38
【问题描述】:

我正在尝试通过编写 ActionFilter 来处理多个表单提交。我是 ActionFilters 领域的新手,不知道从哪里开始任何帮助将不胜感激。 我看过这个问题,但找不到起点

How to handle multiple submissions server-side

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-3


    【解决方案1】:

    我会为此使用防伪令牌。你应该已经生成了它(如果你不想受到 CSRF 攻击),并且它对于每个生成的表单都是唯一的。所以你可以创建一个过滤器,它基本上可以做到这一点:

    1. 在表单集合中查找防伪令牌
    2. 查看 session["LastFormToken"](或您喜欢的任何键) - 如果此表单(令牌)已提交
    3. 如果是,则丢弃请求,如果不是(第一次提交表单),则将其放入会话中(这样下次会在那里找到并丢弃请求)

    【讨论】:

      【解决方案2】:

      http://blogs.sonatribe.com/wayne/2011/08/15/acceptparameterattribute-update/

      我解释了如何创建一个属性,允许您根据启动提交的提交按钮的名称来切换目标操作。

      如果需要请告诉我

      【讨论】:

      • tnx 用于回答,但这不是我需要的,我有一个带有单个提交按钮的表单,但有时由于服务器响应缓慢,用户多次单击该按钮,表单被多次提交
      【解决方案3】:

      我想提出一个答案。 这是代码

      public class ValidateSubmitOnceTokenAttribute : ActionFilterAttribute
      {
          public String ErrorView { get; set; }
      
          public override void OnActionExecuting(ActionExecutingContext filterContext)
          {
              String submitOnceToken = null;
              submitOnceToken = filterContext.HttpContext.Request[ViewHelper.SubmitOnceIdentifier];
              if ((bool)filterContext.HttpContext.Session[ViewHelper.SubmitOnceIdentifier + submitOnceToken])
              {
                  if (String.IsNullOrEmpty(View))
                  {
                      filterContext.Result = new EmptyResult();
                  }
                  else
                  {
                      ViewResult newView = new ViewResult();
                      newView.ViewName = ErrorView;
                      filterContext.Result = newView;
                  }
              }
              else
              {
                  filterContext.HttpContext.Session[ViewHelper.SubmitOnceIdentifier + submitOnceToken] = true;
              }
          }
      }
      
      public partial class ViewHelper
      {
          internal const string SubmitOnceIdentifier = "_SUBMIT_ONCE_";
      
          public static MvcHtmlString SubmitOnceToken()
          {
              Guid submitOnceToken = Guid.NewGuid();
              HttpContext.Current.Session[SubmitOnceIdentifier + submitOnceToken] = false;
              return new MvcHtmlString("<input type=\"hidden\" name=\"" + SubmitOnceIdentifier + "\" value=\"" + submitOnceToken.ToString() + "\">");
          }
      }
      

      之后,你只需要在你的方法中包含这个属性

          [ValidateSubmitOnceToken(View="ErrorSubmitOnce")]
          public ActionResult MyAction(Model) {
              ....
          }
      

      并将其包含在您的视图中

          @ViewHelper.SubmitOnceOnlyToken()
      

      此答案使用 Aliostad 描述的技术,但使用操作过滤器实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-28
        • 1970-01-01
        • 2014-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多