2015-12-08 1 views
1

Я отправляю значение обратно из выпадающего списка Html.BeginForm в следующем виде:Null Reference исключение, когда после значения обратно в контроллер

@Using (Html.BeginForm("Index", "Transport", FormMethod.Post)) 
    @Html.DropDownListFor(Function(Model) Model.Projects, New SelectList(Model.Projects, "Id", "Nazwa"), "Select project", New With {.class = "btn btn-primary dropdown-toggle"}) 
    @<input type="submit" value="Submit" /> 
End Using 

Тогда значение будет мой контроллер:

<HttpPost()> _ 
    <ActionName("Index")> _ 
    Public Function IndexPost(fc As FormCollection) As ActionResult 
     If (ModelState.IsValid) Then 
      If IsNumeric(fc(0)) Then 
       Dim ass As Integer = fc(0) 'Id projektu 
      End If 
     End If 
     Return View() 
    End Function 

тогда, когда его приходит к Return View() я получаю сообщение об ошибке на @Html.DropDownListFor линии, как показано ниже:

An exception of type 'System.NullReferenceException' occurred in App_Web_ypztrmjr.dll but was not handled in user code 

Additional information: Object reference not set to an instance of an object 

ответ

0

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" /> 
} 
0

Похоже, вам необходимо перезагрузить данные для Model.Projects. Я предполагаю, что в вашем первоначальном Get Action of the View вы устанавливаете Model.Projects в коллекцию проектов. Вы не задали его в своем сообщении, поэтому, когда он возвращается, модель пуста. Он не может отображать нулевую коллекцию. Другой вариант - использовать Ajax, если вы не хотите перезагружать список проектов.

Смежные вопросы