我正在使用MVC3,并使用自定义ModelBinder传递我构建的ProducerListViewModel。
下面是我目前正在使用的控制器代码:
Function Filter(user As UserModel, viewModel As ProducerListViewModel) As ActionResult
If IsNothing(viewModel) Then
viewModel = New ProducerListViewModel(user)
End If
Return View(viewModel)
End Function
<HttpPost()> _
Function Filter(user As UserModel, viewModel As ProducerListViewModel, <Bind(Prefix:="Filter")> filterModel As ProducerFilterModel) As ActionResult
'update the filter in the view model and send off to the list method
viewModel.Filter = filterModel
Return RedirectToAction("List")
End Function
Function List(user As UserModel, viewModel As ProducerListViewModel) As ActionResult
Return Nothing
End Function这是自定义ModelBinder中绑定的模型的代码
<Serializable()> _
<ModelBinder(GetType(ProducerListViewBinder))> _
Public Class ProducerListViewModel
<XmlIgnore()> _
Public Property Producers As IEnumerable(Of ProducerModel)
Public Property PagingInfo As New PagingInfoModel("Load More Producers")
Public Property Filter As New ProducerFilterModel()
Public Sub New(user As UserModel)
Me.Filter = ProducerFilterBL.Retrieve(user)
End Sub
End Class以下是绑定程序的代码:
Public Class ProducerListViewBinder
Implements IModelBinder
Private Const __sessionKey As String = "ProducerListView"
Public Function BindModel(controllerContext As ControllerContext, bindingContext As ModelBindingContext) As Object Implements IModelBinder.BindModel
Dim filter As ProducerListViewModel
'check to see if the filter exists in session
If IsNothing(controllerContext.HttpContext.Session(ProducerListViewBinder.__sessionKey)) Then
'load existing filter for user and store for later retrieval
Dim user As UserModel = UserBL.RetrieveUser()
filter = New ProducerListViewModel(user)
ProducerListViewBinder.SetItem(filter)
Else
filter = CType(controllerContext.HttpContext.Session(ProducerListViewBinder.__sessionKey), ProducerListViewModel)
End If
Return filter
End Function
End Class流程是这样的:
filterModel As ProducerFilterModel),更新ProducerListFilterModel,并重定向到列表操作G 213
一切正常,但我的问题是:
为什么List操作在ProducerFilterModel的内部有更新版本的ProducerListViewModel?
我喜欢它工作的如此完美,我只是想知道它为什么工作。
发布于 2012-01-19 21:01:00
现在,您已经展示了模型绑定的代码,一切都非常清楚。这个模型绑定将ProducerListViewModel实例存储到会话中,这使它能够在重定向中生存下来。
第一次命中POST Filter操作时,会话中没有任何内容,因此您的自定义模型绑定程序可以进行一些数据库查找或检索值:
Dim user As UserModel = UserBL.RetrieveUser()
filter = New ProducerListViewModel(user)
ProducerListViewBinder.SetItem(filter)然后将此值存储到会话中。我想是ProducerListViewBinder.SetItem干了这件事。不幸的是,你还没有展示它的代码,但我已经准备好赌5块钱,它就是这样做的。
然后执行Filter操作,最后重定向到以ProducerListViewModel作为参数的List操作。因此,您的自定义模型绑定再次启动,但这一次它找到了它先前存储在会话中的实例,它只是从那里返回它。
所以这里没有魔法。它只是使用ASP.NET会话来持久化重定向之间的值。
https://stackoverflow.com/questions/8932768
复制相似问题