首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IModelBinder如何维护模型的当前状态

IModelBinder如何维护模型的当前状态
EN

Stack Overflow用户
提问于 2012-01-19 20:26:10
回答 1查看 381关注 0票数 0

我正在使用MVC3,并使用自定义ModelBinder传递我构建的ProducerListViewModel

下面是我目前正在使用的控制器代码:

代码语言:javascript
复制
    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中绑定的模型的代码

代码语言:javascript
复制
<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

以下是绑定程序的代码:

代码语言:javascript
复制
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

流程是这样的:

  1. 用户导航到筛选页面,点击第一个操作(筛选器)
  2. 用户对过滤器进行更改并提交页面,点击第二个操作(过滤器w/ Post )
  3. 过滤器w/ Post操作使用模型绑定接收更新的过滤器(第三个参数filterModel As ProducerFilterModel),更新ProducerListFilterModel,并重定向到列表操作

G 213

一切正常,但我的问题是:

为什么List操作在ProducerFilterModel的内部有更新版本的ProducerListViewModel

我喜欢它工作的如此完美,我只是想知道它为什么工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-19 21:01:00

现在,您已经展示了模型绑定的代码,一切都非常清楚。这个模型绑定将ProducerListViewModel实例存储到会话中,这使它能够在重定向中生存下来。

第一次命中POST Filter操作时,会话中没有任何内容,因此您的自定义模型绑定程序可以进行一些数据库查找或检索值:

代码语言:javascript
复制
Dim user As UserModel = UserBL.RetrieveUser()
filter = New ProducerListViewModel(user)
ProducerListViewBinder.SetItem(filter)

然后将此值存储到会话中。我想是ProducerListViewBinder.SetItem干了这件事。不幸的是,你还没有展示它的代码,但我已经准备好赌5块钱,它就是这样做的。

然后执行Filter操作,最后重定向到以ProducerListViewModel作为参数的List操作。因此,您的自定义模型绑定再次启动,但这一次它找到了它先前存储在会话中的实例,它只是从那里返回它。

所以这里没有魔法。它只是使用ASP.NET会话来持久化重定向之间的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8932768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档