我可以将ViewBag和模型传递给视图

时间:2014-12-01 23:09:30

标签: asp.net asp.net-mvc vb.net asp.net-mvc-4 viewbag

我可以使用混合方法传递ViewBag(C#)/ ViewData(VB)中的信息,但也包含模型

例如,我开始将一个简单的标题通过错误控制器传递给错误视图:

Function NotFound() As ActionResult
    Response.StatusCode = 404
    ViewData.Add("Title", "404 Error")
    Return View("Error")
End Function

此工作正常,View可以访问属性@ViewData("Title")

然后我想要包含一些由HandleErrorInfo对象中的自定义错误自动路由的异常信息,如下所示:

Function NotFound(exception As HandleErrorInfo) As ActionResult
    Response.StatusCode = 404
    ViewData.Add("Title", "404 Error")
    ViewData.Add("Message", "Sorry, the requested page could not be found.")
    Return View("Error", exception)
End Function

然后,在View上,我声明了一个这样的模型:

@ModelType System.Web.Mvc.HandleErrorInfo

现在,我可以访问@Model.Exception.Message等属性,但我的@ViewData("Title")已消失。

WebViewPage(Of TModel)仍然具有ViewData属性,但看起来我无法从控制器传递任何内容,除非它明确在模型中。

当然,作为一种解决方法,我可以创建一个可以为每个对象强类型存储的基类,但是当我想通过ViewBag传入的所有内容都是标题时,这似乎有点沉重。

有没有办法同时使用ViewBag和模型?

1 个答案:

答案 0 :(得分:1)

在这种情况下发生的事情是,当CustomErrors尝试路由到NotFound控制器上的Error操作时,它只能提供默认构造函数。找不到它,它完全绕过控制器并直接进入错误页面,该错误页面已经准备好要传递的模型。

作为一个小概念证明,传递这两个参数绝对是可能的,如本例所示

<强> TestModel.vb

Public Class TestModel
    Public Property ModelInfo As String
End Class

<强> TestController.vb

Public Class TestController :  Inherits System.Web.Mvc.Controller

    Function Index() As ActionResult
        Dim model As New TestModel With {.ModelInfo = "Hello"}
        ViewData("ViewDataInfo") = "World"
        Return View("Index", model)
    End Function

End Class

<强>测试\ Index.vbhtml

@ModelType TestModel

@Model.ModelInfo @ViewData("ViewDataInfo")