Member 13710772 Ответов: 2

Как предотвратить код, чтобы дважды ударить контроллер?


Первый раз delete работает правильно, но когда я удаляю другую строку без обновления кода страницы, он дважды попадает в контроллер в первый раз, когда он попадает, он удаляет строку, поэтому, когда во второй раз он снова переходит на post HTTP, он дает null, потому что данные были delte в первом хите.

Что я уже пробовал:

вот мой код контроллера

[HttpGet]
       public ActionResult deleteUserDialog(int id)
       {
           var Company = db.tbl_Compnay.Where(x => x.ID == id).Select(a=> new Company{ ID = a.ID }).FirstOrDefault();
           ViewBag.UserId = id;
           return View(Company);
       }
       [HttpPost]
       public ActionResult deleteUserDialog(Company dataObject)
       {

           var Company = db.tbl_Compnay.Where(x => x.ID == dataObject.ID).FirstOrDefault();
           db.tbl_Compnay.Remove(Company);
           db.SaveChanges();

           return Json(new
           {
               Message = "Deleted Successfully."
           }, JsonRequestBehavior.AllowGet);

       }

это удаление кода представления
@{
    Layout = null;
}

<meta name="viewport" content="width=device-width, initial-scale=1">

<link href="~/Content/bootstrap.min.css" rel="stylesheet" />
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
<script src="~/Scripts/bootstrap.min.js"></script>

<div class="modal-header">
    <button type="button" style="margin-right: 10px" class="close" data-dismiss="modal">×</button>
    <br />
    <h4 class="modal-title">Delete Employee</h4>
</div>


<div class="modal-body">

    @using (Html.BeginForm("Delete", "CURD", FormMethod.Post))
    {
        <p>Are you sure you want to delete this?</p>
                <div class="modal-footer">
                    <input type="submit" class="btn btn-danger" value="Delete" />

                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>

                </div>
    }
</div>

2 Ответов

Рейтинг:
2

W∴ Balboos, GHB

Это обычная задача - и обрабатывается с помощью AJAX, выглядит очень красиво, так как экран отбрасывает удаленные записи без заметного обновления.

Теперь, хотя я описываю это так, как если бы это было веб - приложение, основной принцип тот же: каждая запись ссылается на себя-поэтому у нее всегда есть действительная и правильная цель.

Самый простой способ-иметь кнопку в каждой строке, содержащую ссылку, уникальную для этой строки, чтобы ее можно было удалить. После того, как вы ответите на строку, будет нарисован новый список (AJAX), и эта строка исчезнет. Все существующие строки работают одинаково, отправляясь на серверную сторону только ссылка на себя Поскольку они относятся только к самим себе, они (1) всегда правильно выбраны и (2) никогда не являются несуществующей записью (не может быть нулевого значения).

Теперь сделать это с помощью одной кнопки удаления сложнее, но в принципе то же самое. У вас может быть флажок или другой маркер (так что вы можете выбрать много строк, если хотите). Вам нужно отслеживать строки, выбранные, в идеале, по уникальному идентификатору, который ссылается на данные на стороне сервера. Вы можете отправить список и работать с каждым элементом отдельно - а затем отправить обратно обновленный список (пропуская удаленные элементы). Если вы хотите сохранить список, вас может заинтересовать тип='hidden', где вы можете хранить все, что пожелаете, в качестве значения. Кроме того, есть еще JSON.


Рейтинг:
1

Member 7870345

На мой взгляд есть два решения:
1. измените файл .cshtml, соответствующий представлению. Добавьте onclick в кнопку submit, чтобы сначала отключить кнопку submit, а затем выполнить команду submit.
2. в вашем контроллере [POST] если нет строки, Когда вы находите FirstOrDefault, то просто ничего не делайте (не пытайтесь удалить какую-либо строку).