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

时间:2011-11-24 10:24:39

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

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

How to handle multiple submissions server-side

3 个答案:

答案 0 :(得分:3)

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

  1. 查看防伪令牌的表格集合
  2. 查看会话[“LastFormToken”](或您喜欢的任何密钥) - 如果此表单(令牌)已提交
  3. 如果是,请删除请求,如果没有(表单是第一次提交),请将其放入会话中(因此下次会在那里找到,请求将被删除)

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

我想建议一个答案。 这是代码

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描述的技术,但使用动作过滤器实现。