У меня есть следующее представление в моем приложении 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');}
в настоящее время, если два пользователя обращаются к одному и тому же представлению, а затем оба нажимают на ссылку удаления, связанную стот же объект, то для одного из запросов будет сгенерировано нулевое исключение;так как я могу справиться с этой проблемой как на стороне метода действия, так и на стороне представления, чтобы отобразить дружественное сообщение для пользователя;в этих двух случаях: -
- или когда
var a = repository.FindAnswer(id);
возвращает нулевое исключение? - Или когда
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