Как отменить действие ASP.NET MVC - PullRequest
0 голосов
/ 13 мая 2009

Это должно быть просто, но ответ ускользает от меня. Если в моем контроллере есть действие «Сохранить», и при сохранении происходит сбой, как мне отменить действие, не нарушая введенные пользователем данные? Например, индекс строго типизирован как «MyTable»:

Function Index() As ActionResult
    ViewData("message") = "Hello"
    Return View(New MyTable)
End Function

<ActionName("Index"), AcceptVerbs(HttpVerbs.Post)> _
Function Save(ByVal form As MyTable) As ActionResult
    Try
        SaveMyData(form)
        Return RedirectToAction("Index")
    Catch
        AddModelError("form", "An error occurred.")
        ???
    End Try
End Function

В Catch, если я ставлю Return View (форму), я теряю сообщение, переданное через ViewData. Если я перенаправлю на Индекс, я потеряю то, что ввел пользователь. Я думаю, что видел простой (правильный) способ справиться с этим раньше, но если вы не знаете, что искать, трудно найти. Чего мне не хватает?

Ответы [ 3 ]

1 голос
/ 13 мая 2009

На самом деле вам не нужно явно хранить значения формы, так как они сохраняются платформой.

Замена вашего "????" с помощью следующего предупредит ваше представление об ошибках (через свойство ModelState), а также повторно отобразит введенные значения:

Return View(form)
1 голос
/ 13 мая 2009

В Catch, если я добавлю Return View (форму), я потеряю сообщение, переданное через ViewData.

Насколько я понимаю, вы не теряете сообщение, переданное через ViewData - эта функция просто не запускается.

И я бы настоятельно рекомендовал не делать перенаправление или использовать TempData для того, чего вы пытаетесь достичь, в этом просто нет никакого смысла и нет способа, которым MVC должен работать.

Продолжая то, что у вас есть, у меня была бы частная функция, которую оба действия вызывают, чтобы вернуть представление. Он содержит ваши ViewData («message») в одном месте, и у вас все еще есть предыдущие значения в форме (и внутри ModelState, как сказал Джош Э).

ВНИМАНИЕ: код VB.NET от программиста C #; -)

Function Index() As ActionResult
    Return IndexView(New MyTable)
End Function

<ActionName("Index"), AcceptVerbs(HttpVerbs.Post)> _
Function Save(ByVal form As MyTable) As ActionResult
    Try
        SaveMyData(form)
        Return RedirectToAction("Index")
    Catch
        AddModelError("form", "An error occurred.")
    End Try

    Return IndexView(form)
End Function

Private Function IndexView(ByVal form As MyTable) As ActionResult
    ViewData("message") = "Hello"
    Return View(form)
End Function

HTHS, Charles

Ps. Я просто хотел бы добавить, что я нахожу странным, что у вас есть страница индекса, которая отправляет сообщения обратно себе, а затем, если сообщение содержит ошибки, оно отображает страницу индекса снова, НО, если нет ошибок, она перенаправляет обратно на страницу индекса .

Я не знаю, что делает приложение, но похоже, что вы используете индексную страницу / представление для слишком многих вещей.

0 голосов
/ 13 мая 2009

Вы можете использовать TempData для хранения данных из формы во время перенаправления и извлечения данных из TempData в действии Index. Вот обсуждение TempData .

Тогда ваши действия будут выглядеть так (извините за то, что я хорошо знаю синтаксис VB.Net):

Function Index() As ActionResult
    ViewData("message") = "Hello"

    If TempData["FormData"] == Nothing
        Return View(New MyTable)
    Else
        Return View(TempData["FormData"])
    EndIf
End Function

<ActionName("Index"), AcceptVerbs(HttpVerbs.Post)> _
Function Save(ByVal form As MyTable) As ActionResult
    Try
        SaveMyData(form)
    Catch
        AddModelError("form", "An error occurred.")
        TempData["FormData"] = form;
    End Try

    Return RedirectToAction("Index")
End Function

TempData будет хранить данные только для одного запроса от одного и того же хоста. Это почти то же самое, что и flash в Rails.

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