2013-05-13 8 views
0

Мой сервисный уровень отправляет обратно DTO с сообщением Warning/Success/Info/Error на контроллер, который наследуется от базового контроллера, где я обрабатываю сообщения обычным образом.MVC - автоматически обрабатывает уведомления пользователей

Я не знаю, является ли моя реализация полной бессмыслицей, и мне действительно нужен совет!

DTO

Public Class ExecutionResult 
    Public Enum AlertType 
     Warning 
     Success 
     Info 
     [Error] 
    End Enum 

    Public Property Type() As AlertType 
    Public Property Message() As String 
End Class 

Базовый контроллер: (со свойством ExecutionResult, что можно получить доступ из каждого контроллера)

Public Class BaseController 
    Inherits System.Web.Mvc.Controller 

    Protected Overloads Overrides Sub OnActionExecuted(ByVal ctx As ActionExecutedContext) 
     Alert() 
    End Sub 

    Public Property executionResult As New ExecutionResult 

    Public Sub Alert() 
     If Not String.IsNullOrWhiteSpace(Me.executionResult.Message) Then 
      TempData.Add(Me.executionResult.Type, Me.executionResult.Message) 
     End If 
    End Sub 
End Class 

Контроллер:

... 
Inherits BaseController 
... 

Function SomeFunction() As ActionResult 
    executionResult = _service.SomeFunctionInTheServiceLayer(viewModel) 
End Function 

затем отобразить сообщение в парциальном зрения с главной страницы

@For Each item As KeyValuePair(Of String, Object) In TempData 
    If (TempData.ContainsKey(item.Key)) Then 
     @<div class="alert [email protected]"> 
      @item.Value 
     </div>   
    End If 
Next 
+0

Если она работает вы, и вы довольны решением, все в порядке, нет? – Kenneth

+0

Просто хочу знать, есть ли «лучшая практика» для этой ситуации, так как я думаю, что каждый должен как-то уведомлять пользователей в веб-приложениях MVC. – stare

ответ

0

В первой, я бы не стал использовать TempData, поскольку она опирается на SessionState, который должен быть включен для всех контроллеров для работы которых не является лучшей практикой из-за возможного ухудшения производительности.

В любом случае вам не нужно сохранять сообщение в Session/TempData, потому что ваш просмотр отображается в результате ваших действий. Нет необходимости хранить сообщение между запросами. Так что ViewBag должно быть достаточно.

Я думаю, вам нужно позвонить в свою Alert функцию где-нибудь? я бы определить функцию в basecontroller, который хранит сообщение в ViewBag (К сожалению, его в C#):

public void SetAlert(ExecutionResult result) { 
    ViewBag.Alert = result; 
} 

на ваш взгляд, вы можете просто получить доступ к ViewBag:

@if (ViewBag.Alert != null) { 
    <div class="alert [email protected](ViewBag.Alert.Type)"> 
     @ViewBag.Alert.Message 
    </div>   
} 
+0

Спасибо за ваш ответ! Было бы невозможно использовать ViewBag с вызовом RedirectToAction? Мне не нужно вызывать функцию «Alert», потому что я перехватываю OnActionExecuted, который полагается на публичное свойство, объявленное в базовом контроллере. – stare

+0

Да, это правильно. Если вы хотите сохранить оповещение между запросами, вы должны использовать какое-то хранилище. – Jan

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