2010-10-05 1 views
6

Большинство примеров ASP.NET MVC, которые я видел, изображают сценарии, в которых пользователь просматривает объект (или набор объектов), а затем переходит с этой страницы на страницу, отображает форму, которую пользователь завершает. При отправке формы с хорошим вводом пользователь перенаправляется обратно на страницу, где отображается объект (или список), и пользователь может видеть, что их изменения были успешными.ASP.NET MVC Показать конечным пользователям, что действие было успешным

Я столкнулся с сценарием, в котором нет бизнес-правил для просмотра или списка страниц.

Каковы некоторые хорошие подходы к этому сценарию в ASP.NET MVC?

В старые времена с классическим ASP и ASP.NET я обрабатывал вход, а затем показывал пользователю сообщение об успешном завершении или форму с ошибками - все с той же страницы. Похоже, что это противоречит лучшим практикам (SRP, без логики во взглядах и т. Д.).

Один простой подход - перенаправить на новую страницу, которая сообщает пользователю, что их изменения были успешными, но затем пользователь может посетить эту страницу в любое время. Если я начну вводить логику для защиты от этого (т. Е. Tempdata), решение начинает чувствовать себя грязным.

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

ответ

3

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

ShowMessage("A nice message here.", MessageType.Success);

Затем в главной странице у меня есть вызов на вспомогательный метод, который делает общий частичный вид, который отображает сообщения в случае, если Есть какие-либо. Сообщения хранятся в TempData с фиксированным ключом. Вы можете использовать стили, которые отображаются в Blueprint css framework для отображения сообщений в соответствии с их типом.

Вот часть кода:

public void ShowMessage(string message, MessageType messageType) 
{ 
    var messageViewModel = new MessageViewModel(message, messageType); 
    TempData["Message"] = messageViewModel; 
} 

Частичный вид:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Models.MessageViewModel>" %> 
<%var className = Model.MessageType.ToString().ToLower(); %> 
<div class="<%=className%>"> 
    <%=Html.Encode(Model.Message)%> 
</div> 

я уверен, что может быть лучше подходит, как с помощью фильтров, но этот подход очень полезно для меня ,

+0

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

1

вы можете положить что-то в ViewData и на странице сделать что-то вроде

<% if (viewdata["success"] != null){%> 
<script> 
$("#successDialog").dialog('open'); 
</script> 
<%}%> 

и ваш пользователь увидит всплывающее окно, сообщая ему об успехе http://jqueryui.com/demos/dialog/

+1

Если вы используете шаблон Post-Redirect-Get (PRG), вам придется использовать TempData вместо ViewData. – uvita

+1

@uvita не обязательно, это может быть что-то вроде возврата RedirectToAction («Index», new {success = true}); и действие индекса устанавливает viewdata – Omu

 Смежные вопросы

  • Нет связанных вопросов^_^