Обработка параллельного доступа для удаления объекта с использованием Ajax.actionlink - PullRequest
0 голосов
/ 15 марта 2012

У меня есть следующее представление в моем приложении asp.net MVC, которое содержит ajax.actionlink для удаления объектов: -

<table id="incrementanswer">
    <tr>
        <th>
            Description
        </th>
        <th>
            Answer 
        </th>
        <th></th>
    </tr>

@foreach (var answer in Model.Answers.OrderBy(a => a.IsRight))
{
       <tr id =  @answer.AnswersID>

        <td>
            @Html.DisplayFor(modelItem => answer.Description)
        </td>
        <td>
            @Html.DisplayFor(modelItem => answer.Answer_Description.description)
        </td>
        <td>

       @{ string i = "Are uou sure you want to delete " + @answer.Description.ToString() + " ?";}
         @Ajax.ActionLink("Delete", "Delete", "Answer",
        new { id = answer.AnswersID },
          new AjaxOptions
          {
              Confirm = i,
              HttpMethod = "Post",
              OnBegin = string.Format(
                       "disablelink({0})",
                       Json.Encode(answer.AnswersID)),
              OnSuccess = string.Format(
                        "deleteconfirmation3({0},{1})",
                        Json.Encode(answer.AnswersID), Json.Encode(answer.Description))
          })  </td>
        </tr>}</table>

и следующий метод действия после удаления, который будет вызван вышеупомянутым ajaxссылка: -

[HttpPost] 
        public void Delete(int id) 
        {       var a = repository.FindAnswer(id); 
                repository.DeleteAnswer(a); 
                repository.Save();} 

и сценарий Folloiwng OnSuccess: -

function deleteconfirmation3(rid, rname) {
    $('#' + rid).remove();
    jAlert(rname + ' Was Deleted Succsfully succsfully', 'Deletion Confirmation');}

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

  1. или когда var a = repository.FindAnswer(id); возвращает нулевое исключение?
  2. Или когда repository.Save(); не удаляет никакую запись?

BR

Редактировать: -

я обновил метод пост-действия следующим образом: -

[HttpPost]
    public ActionResult Delete(int id)
    {

        try
        {
            Thread.Sleep(1000);
            var a = repository.FindAnswer(id);

            repository.DeleteAnswer(a);
            repository.Save();
            return Json(new { IsSuccess = "True", id = id, description = a.Description }, JsonRequestBehavior.AllowGet); 
        }
        catch (ArgumentNullException) {
            return Json(new { IsSuccess = "False" }, JsonRequestBehavior.AllowGet);  }}

и в представлении iобновите ajax.actionlink на folloiwng: -

@{ string i = "Are uou sure you want to delete " + @answer.Description.ToString() + " ?";}
         @Ajax.ActionLink("Delete", "Delete", "Answer",
        new { id = answer.AnswersID },
          new AjaxOptions
          {
              //OnBegin = "deleteconfirmation1",
              Confirm = i,
              HttpMethod = "Post",
              OnBegin = string.Format(
                       "disablelink({0})",
                       Json.Encode(answer.AnswersID)),

              OnSuccess =  "myresponse" 
        })

и сценарий Onsuccess: -

    function myresponse(data) {
    if (data.IsSuccess == "True") 
    {
        $('#' + data.id ).remove();
        jAlert(data.description + ' Was Deleted Succsfully succsfully', 'Deletion Confirmation');
    }
    else {
        $('#' + data.id).remove();
        jAlert(data.description + 'record has already been deleted', 'aaaa');
    } 
}

При проверке этого кода код работал нормально, но делает этоПодход звучит приемлемо, так как я не писал ничего подобного раньше? BR

1 Ответ

1 голос
/ 15 марта 2012

Добавьте проверку, чтобы, если запись существует, удалите ее или покажите сообщение, указывающее, что запись уже удалена ...

[HttpPost] 
public ActionResult Delete(int id) 
{       var a = repository.FindAnswer(id); 
        if(/*check if a is not null*/){
        repository.DeleteAnswer(a); 
        repository.Save();
        return Json(new{ IsSuccess="True", id=id,description=a.Description });
        }else{
            // display a message record already been deleted
          return Json(new{ IsSuccess="False" });
       }     

 } 

очевидно, вам нужно изменить тип возврата с void на ActionResult или JsonResult

@Ajax.ActionLink("Delete", "Delete", "Answer",
        new { id = answer.AnswersID },
          new AjaxOptions
          {
              Confirm = i,
              HttpMethod = "Post",
              OnBegin = string.Format(
                       "disablelink({0})",
                       Json.Encode(answer.AnswersID)),
              OnSuccess = "myResponse"
          })

обработчик успеха будет похож на

function myResponse(data){
 if(data.IsSuccess=="True")
   jAlert(data.description + ' Was Deleted Succsfully succsfully', 'Deletion Confirmation');
  else {
   alert("record has already been deleted");
  }

}

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