2010-01-26 2 views
14

Для сообщений об ошибках, ошибках проверки и т.д. у вас естьсообщения успеха в отличие от модели состояния сообщения об ошибках

ModelState.AddErrorMessage("Fool!"); 

Но, где вы вкладываете ответы успеха, как «Вы успешно перенесены много денег на ваш отл.» + «Ваш баланс теперь равен нулю». Я все еще хочу установить его на уровне контроллера и, предпочтительно, с ключом, так же, как и с ошибками, но без аннулирования состояния модели.

Как это обычно делается? ViewData?

+0

Можете ли вы просто сделать его зеленым? – Scozzard

+1

Я не рассматривал этот параметр, но рассмотрел ли вы расширение объекта ModelState для включения сообщений об успешности и сообщений об отказах? – Odd

ответ

21

Я бы населить TempData [ "успех"] (что или когда-либо ключ, который вы хочу дать это) с сообщением, которое я хочу отобразить в контроллере, а затем перенаправить соответствующим образом (например, если я отредактирую пользователя, я перенаправляюсь обратно в список пользователей). Это зависит от шаблона POST/Redirect/GET, который в любом случае является хорошей практикой.

TempData["success"] = "Your Balance is now zero"; 

На главной странице У меня есть раздел, который проверяет эту переменную и отображает сообщение в симпатичном стиле div. Что-то вроде (не может быть на 100% правильным):

<% if(TempData["success"] != null) { %> 
     <div id="SuccessMessage"><%= Html.Encode(TempData["success"]) %><div> 
<% } %> 
+1

Если вы не хотите использовать Post/Redirect/Get pattern, вы можете использовать ViewData, а не TempData, чтобы удерживать значение. Я очень рекомендую использовать Post/Redirect/Get, хотя ... – Rosstified

+0

Это делает много смысла. Где вы учите такие вещи? – Martin

+0

В новом MVC вы можете сделать то же самое с ['ViewBag.Success'] (http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc- 3-приложения) – drzaus

7

Я полагаю, вы могли бы проверить ModelState и установить переменную в модели ...

public ActionResult MyAction(MyEntity model) 
{ 
    //Here would be some validation, which returns with ModelState errors 

    //Now set the validity of the modelstate as the IsValid property in your entity 
    model.IsValid = ModelState.IsValid; 

    return View(model); 
} 

По вашему мнению ...

<% if(Model.IsValid) { %> 
    <p>You successfully transfered your balance to your ex.</p> 
<% } %> 

Edit: Учитывая обновленный вопрос, Я думаю, вы смотрите на неправильный подход. Я согласен с другими ответами и следую PRG pattern. Это определенно имеет больше смысла, чем попытка добавить фальшивую ошибку.

+0

Эй, Дэн, снова придя на помощь. Это только дает мне один ответ. Я перефразирую вопрос. – Martin

+0

будет успешным сообщение, отображаемое при первом посещении страницы? Потому что ModelState тоже будет действовать. – Muflix

+1

@Muflix Это хороший вопрос. Вышеприведенный код является запросом 'POST', поэтому запрос' GET' не попадет в этот код. Кроме того, значение по умолчанию для boolean равно 'false', поэтому, если вы явно не установили' IsValid' в 'true' в первом запросе, это не должно быть проблемой. –

0

Вы должны реализовать что-то вроде шаблона POST/Redirect/GET и «перенаправить» на другое представление в конце ваших методов действий после того, как все проверки были проверены и все выполнено нормально. Вы можете передать весь экземпляр объекта в представление назначения или просто передать текстовое сообщение, или вы можете вытащить текст в целевом представлении «Просмотр» из файла web.config или из файла ресурсов.

Например, у меня есть один вид в общей папке с именем «ChangeSuccess.aspx», на который я перенаправляю все мои удачные изменения. & создает.

Вы "перенаправить", как это

return View("ChangeSuccess", objectInstance); 

(примечание: на самом деле не перенаправлять см комментарии)

+1

Я почти полностью уверен, что 'return View' ** не выполняет перенаправление **, а приводит к тому, что другой контент возвращается одним и тем же ответом.Я думаю, вы имели в виду 'return this.Redirect (" new-url ")' или 'return this.RedirectToAction (...)'. – drzaus

+0

Хотя это старый вопрос, вы являетесь автором в своем комментарии. Вышеупомянутая строка не выполняет перенаправление, а отображает другое представление с указанной моделью. – mare