2016-11-02 2 views
-1

У меня есть приложение MVC, которое представляет собой очень простую форму из 6 полей. Данные формы сохраняются в моей базе данных через Entity Framework. В большинстве случаев данные сохраняются должным образом без проблем, но появляются случайные дубликаты. Сначала я подумал, что это проблема EF с дубликатами (иногда 1,3,5 из той же записи), которые сохраняются с отметкой времени менее секунды, разделяющей их. Но я провела единичный тест и вытащила всю ту же логику, что и в моем действии контроллера, чтобы сохранить данные, и мои данные никогда не дублируются. У меня JQuery, который отключает кнопку отправки, поэтому я знаю, что она не связана с несколькими кликами.ASP.NET MVC Post Controller Действие, вызываемое несколько раз

Итак, мой вопрос: возможно ли, что мои действия POST-контроллеров можно вызвать много раз через какое-то неизвестное поведение? Я не могу реплицировать проблему в VS, когда я установил точку останова в моем действии контроллера, где данные сохраняются. Мне также трудно воспроизвести в целом и полностью случайным. Кто-нибудь сталкивался с этим когда-либо или имел какие-либо предложения? Это происходит во всех браузерах (FF, IE, Chrome). Спасибо

Я запускал свое приложение через скрипач, а иногда, когда я отправляю свою форму, я вижу 2 запроса POST на одно нажатие одной кнопки.

Код

@model PersonViewModel 
@using (Html.BeginForm()) 
    { 
    @Html.AntiForgeryToken() 

<div class="form-horizontal"> 


    @Html.ValidationSummary(false, "The following errors have occurred:", new { @class = "alert alert-danger", @role = "alert" }) 



    <hr /> 

     <p>Please enter your personal details below. (* denotes required field)</p> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.FirstName, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.FirstName, new { htmlAttributes = new { @class = "form-control", @maxlength = "50", @title = "Legal First Name" } }) 
       @Html.ValidationMessageFor(model => model.FirstName, "", new { @class = "text-danger" }) 

      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.MiddleName, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.MiddleName, new { htmlAttributes = new { @class = "form-control", @maxlength = "50", @placeholder = "enter 'None' if none", @title = "Legal Middle Name" } }) 
       @Html.ValidationMessageFor(model => model.MiddleName, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.LastName, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.LastName, new { htmlAttributes = new { @class = "form-control", @maxlength = "50", @title = "Legal Last Name" } }) 
       @Html.ValidationMessageFor(model => model.LastName, "", new { @class = "text-danger" }) 


      </div> 
     </div> 



     <div class="form-group" id="EmailGroup"> 
      @Html.LabelFor(model => model.EmailAddress, htmlAttributes: new { @class = "control-label col-md-2", @id = "EmailLabel" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.EmailAddress, new { htmlAttributes = new { @class = "form-control", @maxlength = "100", @title = "Email Address" } }) 
       @Html.ValidationMessageFor(model => model.EmailAddress, "", new { @class = "text-danger" }) 


      </div> 
     </div> 

     </div> 





     <div class="form-group"> 
      <div class="col-md-2"></div> 
      <div class="col-md-8"> 
       <input type="submit" value="Submit" id="affSubmit" class="btn btn-primary btn-md" /> 
      </div> 
     </div> 

    </div> 


        } 


@section Scripts { 
@Scripts.Render("~/bundles/jqueryval") 

@Scripts.Render("~/Scripts/Custom.js") 



} 

Layout.cshtml

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8" /> 
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> 
<meta name="viewport" content="width=device-width, initial-scale=1.0"> 
@Styles.Render("~/Content/css") 
@Scripts.Render("~/bundles/modernizr") 
</head> 
<body> 
<div class="navbar navbar-inverse navbar-default"> 

</div> 
<div class="container body-content"> 
    @RenderBody() 
    <hr /> 
</div> 
@Scripts.Render("~/bundles/jquery") 
@Scripts.Render("~/bundles/bootstrap") 
@Scripts.Render("~/bundles/jquery-ui") 
@RenderSection("scripts", required: false) 

Custom.js

$().ready(function() { 




$('form').submit(function (e) { 

    if ($('form').valid()) { //make sure form is valid 

       $('#affSubmit').prop('disabled', true); 
       $('#affSubmit').val("Please wait..."); 
       this.submit(); 


     } 


    } 




}); 

ControllerAction

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Index(PersonModel model) 
    { 

     try 
     { 

       if (ModelState.IsValid) 
       { 

        PersonBLL bll = new PersonBLL(); 
        PersonModel result = bll.SavePerson(model); 

        if (result.PersonID > 0) 
        { 
         return View("CreateSuccess"); 
        } 
        else 
        { 
         ModelState.AddModelError("SaveError", "An error occurred while attempting to save, please try again later."); 
        } 

       } 

     } 
     catch (Exception ex) //unexpected error so log it, and redisplay form 
     { 
      Common.HandleException(ex); 
      ModelState.AddModelError("SaveError", "An error occurred while attempting to save, please try again later."); 

     } 


     //if we get here reshow page 
     return View(model); 


    } 
+0

Вы используете jquery Ajax для публикации данных? – Aravind

+0

@ Aravind нет, я не, просто нормальная форма submit. – Scott

+1

Вы используете инъекцию зависимостей в 'ActionFilterAttribute'? Иногда Ninject может вызвать подобную проблему, но фильтр вызывается несколько раз. Пожалуйста, отправьте код, чтобы мы поняли, в чем проблема. – Transcendent

ответ

0

Использование preventDefault при отправке с JQuery добавить к вашему cutsom.js файла

$().ready(function() { 
    // not here 
    $('form').submit(function (e) { 
    e.preventDefault();// but here 
    // the rest of your code here 
    } 
} 

Сначала я отредактировал мой ответ, e.preventDefault идет в EventHandler представить. Поведение формы по умолчанию должно быть отправлено, когда вы нажимаете кнопку «Отправить», поэтому ваша форма отправляется дважды дважды из-за поведения по умолчанию, а вторая - с вашим кодом this.submit(); e.preventDefault отменяет поведение по умолчанию для события отправки, поэтому форма отправляется только с вашим кодом.

+0

Это сработало! Можете ли вы объяснить, почему мне нужно добавить это в JQuery, я не понимаю, почему это приведет к тому, что моя страница будет отправляться дважды? Спасибо – Scott

+0

Да, я понял это, спасибо еще раз! – Scott

+0

Добро пожаловать. Пожалуйста, отметьте этот ответ как принятый ответ, если считаете, что он отвечает на ваш вопрос. – lyz

Смежные вопросы