C# 通过ActionFilterAttribute mvc3.net处理多表单提交

C# 通过ActionFilterAttribute mvc3.net处理多表单提交,c#,asp.net,asp.net-mvc,asp.net-mvc-3,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,我试图通过编写ActionFilter来处理多个表单提交。我是ActionFilters领域的新手,不知道从哪里开始。我非常感谢您的帮助。 我看了这个问题,但没有一个起点 我将解释如何创建一个属性,该属性允许您根据启动提交的提交按钮的名称切换目标操作 如果您需要指针,请告诉我我会为此使用防伪令牌。您应该已经生成了它(如果您不想受到CSRF攻击),并且它对于生成的每个表单都是唯一的。。因此,您可以创建一个过滤器,它基本上可以执行以下操作: 查找表格集合中的防伪令牌 查看会话[“LastFormT

我试图通过编写ActionFilter来处理多个表单提交。我是ActionFilters领域的新手,不知道从哪里开始。我非常感谢您的帮助。 我看了这个问题,但没有一个起点

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


如果您需要指针,请告诉我

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

  • 查找表格集合中的防伪令牌
  • 查看会话[“LastFormToken”](或您喜欢的任何键)-如果此表单(token)已提交
  • 如果是,则删除请求;如果不是(表单是第一次提交),则将其放入会话中(以便下次在会话中找到它并删除请求)

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

    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() + "\">");
        }
    }
    
    并将此包含在您的视图中

        @ViewHelper.SubmitOnceOnlyToken()
    

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

    tnx用于回答,但这不是我需要的。我有一个带有单个提交按钮的表单,但有时由于服务器响应缓慢,用户多次单击按钮,表单被提交多次
        @ViewHelper.SubmitOnceOnlyToken()