Asp.net mvc 将值返回控制器时出现空引用异常

Asp.net mvc 将值返回控制器时出现空引用异常,asp.net-mvc,vb.net,Asp.net Mvc,Vb.net,我从Html.BeginForm的下拉列表中返回值,如下所示: @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-prim

我从Html.BeginForm的下拉列表中返回值,如下所示:

@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

如果ModelState为false,则返回到视图和视图中,Html.DrpoDownListFor方法将使用传递给视图的viewmodel/模型的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
记住HTTP是无状态的。在返回视图之前,需要重新加载数据以再次呈现下拉列表。此外,还需要将相同的viewmodel/model对象传递给视图,这与GET操作中的操作相同

另外,在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操作方法中,当用户提交表单时,您将获得相同viewmodel的实例。当ModelState.IsValid为false时,我们将重新加载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" />
}

如果ModelState为false,则返回到视图和视图中,Html.DrpoDownListFor方法将使用传递给视图的viewmodel/模型的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
记住HTTP是无状态的。在返回视图之前,需要重新加载数据以再次呈现下拉列表。此外,还需要将相同的viewmodel/model对象传递给视图,这与GET操作中的操作相同

另外,在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操作方法中,当用户提交表单时,您将获得相同viewmodel的实例。当ModelState.IsValid为false时,我们将重新加载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" />
}

看起来您需要重新加载Model.Projects的数据。我的猜测是,在视图的初始Get操作中,您将Model.Projects设置为一个项目集合。您没有在帖子中设置它,因此当它返回时,模型为空。它不能呈现空集合。如果您不想重新加载项目列表,另一种选择是使用Ajax。

看起来您需要重新加载Model.Projects的数据。我的猜测是,在视图的初始Get操作中,您将Model.Projects设置为一个项目集合。您没有在帖子中设置它,因此当它返回时,模型为空。它不能呈现空集合。如果不想重新加载项目列表,另一种选择是使用Ajax