Я использую IModelBinder на моих сложных классах. Вам не нужен IModelBinder, но он сделает ваш пост-кодовый блок контроллера более чистым. Я сейчас использую VB, но мой класс выглядит примерно так:
Public Class CombinedRulesAndXmlRules : Implements IModelBinder
Public Rules As New Rules()
Public XmlRules As New XmlRules()
Public RequiredTemplates As New List(Of RequiredTemplates)
Public SearchCriteria As New List(Of SearchCriteriaList)
Public OptionalTemplates As New List(Of OptionalTemplates)
Public Questions As New List(Of Questions)
Public QATemplates As New List(Of QATemplates)
**Public Answers As New List(Of Answers)**
Теперь я не использую шаблоны редактора в своих представлениях, поэтому, чтобы ваши списки появлялись в коллекции форм, вы должны добавить что-то вроде этого в ваше представление:
@For x As Integer = 0 To Model.Answers.Count - 1
Dim incr As Integer = x
@Html.HiddenFor(Function(model) model.Answers(incr).Answer)
@Html.HiddenFor(Function(model) model.Answers(incr).AnswerId)
@Html.HiddenFor(Function(model) model.Answers(incr).AnswerTemplateTag)
@Html.HiddenFor(Function(model) model.Answers(incr).Tag)
Next
Когда представление отправлено / опубликовано, механизм связывания модели вступает во владение, прежде чем нажать на первую строку кода в методе пост-контроллера mvc. Затем я перебираю фактическую коллекцию форм и удаляю [#] с помощью регулярных выражений, потому что ваша коллекция форм будет отображать элементы вашего списка следующим образом: Ответы [0]. Ответ, Ответы [0] AnswerId и т.
For x As Integer = 1 To request.Form.Count - 1
keyname = request.Form.Keys(x)
Debug.Write(keyname)
val = request.Form(x).ToString()
'If keyname contains [#] strip it. it's a list item.
Dim pattern As String = "\[(\d+)\]"
Dim iterpattern As String = "\d+"
Dim rgx As New Regex(pattern)
Dim rgxiter As New Regex(iterpattern)
If Regex.IsMatch(keyname, pattern) Then
Dim match As Match = rgxiter.Match(keyname)
ListIteration = CInt(match.Value)
Dim result As String = rgx.Replace(keyname, "")
keyname = result
End If
Следующий кодовый блок Select Case. Итак, вы уже знаете, что у вас есть строго типизированный класс в вашей модели, поэтому ваш выбор может выглядеть так:
Select Case keyname
Case "Answers.Answer"
'add code here to add to your return list. What you
'get in the post controller is a fully populated class.