我可以使用混合方法传递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和模型?
答案 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")