Распространенный сценарий, с которым я сталкиваюсь, - это предоставление уведомлений / подтверждений пользователям после того, как они выполнили действие, чтобы сообщить им об успехе.
Например, предположим, что пользователь предоставляет отзыв в форме обратной связи, а затем нажимает Отправить отзыв . Вы можете отобразить сообщение «Спасибо за отзыв» после того, как вы выполнили некоторую проверку, например, у них есть действующий адрес электронной почты в базе данных. Какой-то псевдокод:
public ActionResult SubmitFeedback(string Feedback, int UserID)
{
MyDataContext db = new DataContext()
if(db.usp_HasValidEmail(UserID)) //Check user has provided a valid email
return View("Index"); //Return view and display confirmation
else
ModelState.AddModelError("InvalidEmail", "We do not hold an email record for you. Please add one below");
return View("Index);
}
Я понимаю, как проверять записи с помощью Html.ValidationMessage
и т. Д. Это нормально, и я обычно проверяю наличие недействительных записей либо с помощью jQuery на стороне клиента, либо в начале своего действия (т. Е. Перед тем, как начать работу с базой данных) и выхожу действие, если есть недействительные записи.
Однако как насчет сценария, в котором все записи действительны и вы хотите отобразить подтверждающее сообщение?
Вариант 1 : Полностью отдельный вид
Кажется, что это нарушает принципы СУХОГО, поскольку совершенно новый View (и ViewModel) отображают практически идентичную информацию, за исключением уведомления пользователя.
Опция 2 : Условная логика в представлении
В этом сценарии у меня может быть условный оператор в представлении, который проверяет наличие некоторых TempData, которые передаются в действии SubmitFeedback
. И снова псевдокод:
<% if(TempData["UserNotification"] != null {%>
<div class="notification">Thanks for your Feedback!</div>
<% } %>
Опция 3 : Использование jQuery для проверки TempData при загрузке страницы
В этом сценарии у меня будет скрытое поле, которое я буду заполнять TempData с помощью действия SubmitFeedback
. Затем я бы использовал jQuery для проверки значения скрытого поля. Еще псевдокод:
<%=Html.Hidden("HiddenField", TempData["UserNotification"])%> //in View
$(document).ready(function() {
if ($("input[name='HiddenField']").length > 0)
$('div.notification').show();
setTimeout(function() { $('div.notification').fadeOut(); }, 3000);
});
Мои первые мысли по этому поводу:
- Вариант 1: Полное разделение видов, но кажется излишним и неэффективным (нарушает DRY)
- Вариант 2: Достаточно прост, но в View есть условная логика (разве я не принесен в жертву на алтаре MVC для этого?!?)
- Вариант 3: Такое ощущение, что все усложняется. Тем не менее, он избегает логики в View.
Что вы скажете? Вариант 1,2,3 или нет? Есть ли способ лучше?
Пожалуйста, увеличьте мои шаблоны кодирования!