I f ModelState является ложным, вы возвращаетесь к представлению и в представлении, а метод Html.DrpoDownListFor
собирается использовать коллекцию модели/модели, представленную в представлении, Projects
.
Помните, что HTTP не имеет гражданства. вам нужно перезагрузить данные, чтобы снова отобразить выпадающее меню, прежде чем вернуться к просмотру. Кроме того, вам необходимо передать один и тот же объект viewmodel/model в представление (так же, как в действии GET)
Также рекомендуется использовать экземпляр viewmodel в методах действий GET и POST для передачи данные между вашим видом и методом действия
Так Давайте предположим, что мы имеем ViewModel как этот
Public Class CreateUser
Public Property Name() As String
Get
Return m_Name
End Get
Set
m_Name = Value
End Set
End Property
Private m_Name As String
Public Property SelectedProject() As String
Get
Return m_SelectedProject
End Get
Set
m_SelectedProject = Value
End Set
End Property
Private m_SelectedProject As String
Public Property Projects() As List(Of SelectListItem)
Get
Return m_Projects
End Get
Set
m_Projects = Value
End Set
End Property
Private m_Projects As List(Of SelectListItem)
End Class
и в вашем GET действий, вы создаете объект этого установите Projects
коллекцию и отправить к просмотру и в вашем методе действия HttpPost вы получите экземпляр той же модели просмотра, когда пользователь отправит форму. Когда ModelState.IsValid
является ложным, мы перезагрузим коллекцию Projects
и снова отправим модель просмотра в представление.
Public Function Index() As ActionResult
Dim vm = New CreateUser()
' Hard coded for demo. You may replace it with data from db
vm.Projects = New List(Of SelectListItem)() From { _
New SelectListItem() With { _
Key .Value = "MI", _
Key .Text = "MI" _
}, _
New SelectListItem() With { _
Key .Value = "OH", _
Key .Text = "Ohio" _
} _
}
Return View()
End Function
<HttpPost> _
Public Function Index(model As CreateUser) As ActionResult
If ModelState.IsValid Then
' Save
End If
' Reload the Projects collection
' Hard coded for demo. You may replace it with data from db
model.Projects = New List(Of SelectListItem)() From { _
New SelectListItem() With { _
Key .Value = "MI", _
Key .Text = "MI" _
}, _
New SelectListItem() With { _
Key .Value = "OH", _
Key .Text = "OHio" _
} _
}
Return View(model)
End Function
Предполагая, что ваше представление строго типизировано для модели представления CreateUser. Вот версия C#. Пожалуйста, преобразуйте в VB.NET
@model CreateUser
@using (Html.BeginForm())
{
@Html.DropDownListFor(s=>s.SelectedProject, Model.Projects,"select one")
<input type="submit" />
}