Правильный способ обработки повторной отправки пользователя для удаления действий? - PullRequest
1 голос
/ 01 февраля 2011

Предположим, пользователь удаляет запись, затем нажимает стрелку назад и повторно отправляет запрос POST.

Какие у меня есть варианты в этом сценарии?

Что предпочтительнее?

 [HttpPost]
    public ActionResult Delete(string EntryName, Guid id, FormCollection collection)
    {
        try
        {
            var ret =  from m in _entities.MyList 
                      where m.MyListID == id
                      && m.EntryName == EntryName
                      select m ;

            if (ret.Count() == 0)
            {
                // This happens if the user pressed the back button and resubmitted
                // todo: ask SO what is the best way to approach this... 
                 // User feedback? How?
                return RedirectToAction("Index", new { id = id });
            }

            _entities.DeleteObject(ret.FirstOrDefault());
            _entities.SaveChanges();

            return RedirectToAction("Index", new { id = id  } );
        }
        catch
        {
            return View();
        }
    }

Ответы [ 2 ]

2 голосов
/ 01 февраля 2011

RESTFul способ справиться с этим - бросить 404 Not Found (потому что пользователь попытался удалить запись, которая больше не существует):

if (ret.Count() == 0)
{
    throw new HttpException(404, "Not found");
}

Другой способ - добавить ошибку в модель.состояние и переотображение представления:

if (ret.Count() == 0)
{
    ModelState.AddModelError("id", "An item with the specified id was not found");
    return View();
}

, и внутри представления у вас будет сводка проверки или сообщение проверки для id для отображения сообщения.

PS: хороший комментарий TODOтам: -)

0 голосов
/ 01 февраля 2011

Вы хотите использовать TempData в этом случае.

 if (ret.Count() == 0)
 {
   TempData["ErrorMessage"] = "Record <Number> does not exist";
   return RedirectToAction("Index");

}

Затем вы можете получить доступ к TempData в представлении для отображения сообщения.Для получения более подробной информации см. ссылку

...