Каков рекомендуемый подход к предоставлению пользовательских уведомлений / подтверждений в MVC? - PullRequest
3 голосов
/ 09 июля 2010

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

Например, предположим, что пользователь предоставляет отзыв в форме обратной связи, а затем нажимает Отправить отзыв . Вы можете отобразить сообщение «Спасибо за отзыв» после того, как вы выполнили некоторую проверку, например, у них есть действующий адрес электронной почты в базе данных. Какой-то псевдокод:

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&#33;</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 или нет? Есть ли способ лучше?

Пожалуйста, увеличьте мои шаблоны кодирования!

Ответы [ 2 ]

6 голосов
/ 09 июля 2010

Мне нравится вариант 1. Также вам не нужны условия, и он работает с отключенным JavaScript.Просто вставьте его где-нибудь на главной странице, и все будет в порядке:

<div class="notification">
    <%= Html.Encode(TempData["Notification"]) %>
</div>

Конечно, вы можете постепенно улучшать / анимировать это, используя какой-нибудь красивый плагин, такой как jGrowl или Gritter или даже посмотрите на , как это делает StackOverflow .

Другое решение - написать помощника, который, вероятно, самый подходящий:

public static class HtmlExtensions
{
    public static MvcHtmlString Notification(this HtmlHelper htmlHelper)
    {
        // Look first in ViewData
        var notification = htmlHelper.ViewData["Notification"] as string;
        if (string.IsNullOrEmpty(notification))
        {
            // Not found in ViewData, try TempData
            notification = htmlHelper.ViewContext.TempData["notification"] as string;
        }

        // You may continue searching for a notification in Session, Request, ... if you will

        if (string.IsNullOrEmpty(notification))
        {
            // no notification found
            return MvcHtmlString.Empty;
        }

        return FormatNotification(notification);
    }

    private static MvcHtmlString FormatNotification(string message)
    {
        var div = new TagBuilder("div");
        div.AddCssClass("notification");
        div.SetInnerText(message);
        return MvcHtmlString.Create(div.ToString());
    }

}

А затем в вашеммастер:

<%= Html.Notification() %>
1 голос
/ 09 июля 2010

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

Итак, в соответствующем месте мастера:

<% Html.RenderPartial("_Notifications") %>

И в частичном виде:

<% if(TempData["UserNotification"] != null {%>
    <div class="notification">Thanks for your Feedback&#33;</div>
<% } %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...