Я работаю с MVC3 и используя пользовательский ModelBinder, чтобы обойти ProducerListViewModel
, который я создал.Как IMODELBinder поддерживает текущее состояние модели
Вот код контроллера Сейчас я работаю с:
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
поток выглядит следующим образом:
- Пользователь переходит фильтровать страницу, попав первое действие (Filter)
- Пользователь вносит изменения в фильтр и подает страницу, попав второе действие (Фильтр ж/сообщение)
- Фильтр ж/сообщение действие получает обновленный фильтр с использованием модели связывания (третий параметр
filterModel As ProducerFilterModel
), обновляетProducerListFilterModel
и перенаправляет к действию Список
Все работает просто отлично, но вот мой вопрос:
Почему в действии списка есть обновленная версия ProducerFilterModel
внутри ProducerListViewModel
?
Мне нравится, что он работает так прекрасно, я просто хочу знать, почему он работает.
IModelBinder - это интерфейс. Простой договор. Он ничего не делает. Вы не указали нам код вашего связующего на заказ модели ProducerListViewBinder', и вы спросите нас, как это работает. Интересно, какой ответ вы ожидаете от такого вопроса. –
@DarinDimitrov: Я добавил код для Binder.Причина, по которой я не думал добавлять код изначально, заключается в том, что когда я устанавливал точку останова в функции «BindModel», она не останавливалась там между вторым действием фильтра и действием «Список». Кстати, не нужно быть таким суровым. :) –