0

我的服务层将带有警告/成功/信息/错误消息的 DTO 发送回控制器,该控制器继承自我自动处理消息的基本控制器。

我不知道我的实现是否完全是一派胡言,我真的想要一些建议!

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 alert-@item.Key">
            @item.Value
         </div>        
    End If
Next
4

1 回答 1

0

起初,我不会使用 TempData,因为它依赖于 SessionState 必须启用所有控制器才能工作,这不是最佳实践,因为可能会降低性能。

无论如何,您不必将消息存储在 Session/TempData 中,因为您的视图是作为您的操作的结果呈现的。无需在请求之间存储消息。所以 ViewBag 应该足够了。

我猜你必须在Alert某个地方调用你的函数?我会在基本控制器中定义一个函数,它将消息存储在 ViewBag 中(对不起,它在 C# 中):

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

在您的视图中,您可以简单地访问 ViewBag:

@if (ViewBag.Alert != null) {
    <div class="alert alert-@(ViewBag.Alert.Type)">
        @ViewBag.Alert.Message
     </div>        
}
于 2013-05-13T09:01:19.200 回答