Обработка множественной отправки формы через ActionFilterAttribute mvc3.net - PullRequest
2 голосов
/ 24 ноября 2011

Я пытаюсь обработать несколько отправленных форм, написав ActionFilter.Я новичок в области ActionFilters и не знаю, с чего начать любую помощь будет высоко ценится.Я посмотрел на этот вопрос, но не смог получить отправную точку

Как обрабатывать несколько запросов на стороне сервера

Ответы [ 3 ]

3 голосов
/ 24 ноября 2011

Я бы использовал токен для подделки для этого.Он должен быть уже сгенерирован (если вы не хотите быть уязвимым для CSRF-атак), и он уникален для каждой сгенерированной формы ... поэтому вы можете создать фильтр, который будет в основном так:

  1. посмотрите в коллекции форм токен против подделки
  2. посмотрите сеанс ["LastFormToken"] (или любой другой ключ, который вам нравится) - если эта форма (токен) уже была отправлена ​​
  3. , если да, отбросьте запрос, если нет (форма отправляется в первый раз), поместите ее в сеанс (поэтому в следующий раз она будет найдена там и запрос будет отклонен)
0 голосов
/ 29 октября 2012

Я хотел бы предложить ответ. Вот код

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, но реализованная с использованием фильтра действий.

0 голосов
/ 24 ноября 2011

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

Я объясняю, как создать атрибут, который позволяет переключать целевое действие на основе имени кнопки отправки, инициирующей отправку.

Дайте мне знать, если вынужны указатели

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...