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