html.dropdownlistfor 未选择所选值
html.dropdownlistfor selected value not selected
在这个问题上卡了 2 天...希望大家能帮忙。
使用 VB.Net 和 MVC4 框架。
我的视图中有一个 Html.DropDownListFor,如下所示:
@Html.DropDownListFor(Function(model) model.Title, New SelectList(Model.Titles, "Key", "Value"), "-select-", New With {.id = "titles", .class = "form-control"})
Model.Titles 是一个 Dictionary(Of String, String) ,这是一个如此短的列表,我宁愿直接从函数而不是数据库中提取它。从这里得到使用字典列表的想法:
我的函数看起来像这样,它作为 Model.Titles
被拉入我的模型
Public Function getAgcRepTitles() As Dictionary(Of String, String)
Dim list As New Dictionary(Of String, String)
list.Add("A/D/SGT", "A/D/SGT")
list.Add("A/SGT", "A/SGT")
list.Add("CPL", "CPL")
list.Add("DET", "DET")
Return list
End Function
一切正常,它显示列表并将所选值保存到数据库中。在调试模式下,当我在视图中浏览 DropDownListFor 时,我可以看到 Model.Title 已从数据库中检索到正确的值(例如 "DET"),并且我可以看到 Model.Titles包含我的函数中的上述列表。但是尽我所能,我无法让 DropDownListFor 显示列表中的 Model.Title。
HTML 中的 Select 元素没有选定的选项,但其他方面看起来不错:
<select name="Title" class="form-control">
<option value="">-select-</option>
<option value="A/D/SGT">A/D/SGT</option>
<option value="A/SGT">A/SGT</option>
<option value="CPL">CPL</option>
<option value="DET">DET</option>
</select>
我尝试将 Model.Title 值添加到视图中 SelectList 的 SelectedValue。我试过使用 SelectListItems 列表而不是 Dictionary 并通过 Viewbag.myTitles 将其发送到视图。我试过使用整数作为键值(0、1、2、3 ...)。没有任何效果。
我还应该补充一点,我在同一个视图中还有另一个 DropDownListFor,它运行良好。当你比较它们时......这个从数据库中提取它的列表作为 SelectListItems 到 SelectList(它分别使用值和文本,而不是键和值),其中值是一个从零开始的整数,文本是字符串。
这个真的让我很头疼。
编辑:更多信息。当我提交表单时,修改后的数据成功上传到数据库,Controller将模型数据发回给View。好的....在这个视图中,DropDownListFor 有效!!!但随后我单击刷新,我从 DropDownListFor 中丢失了我选择的值(即使我的模型数据是相同的)。
这是我的控制器:
<AllowAnonymous()> _
Function Update() As ActionResult
If WebSecurity.IsAuthenticated Then
Dim user = db.AgcRepProfile.Where(Function(AgcRep) AgcRep.Email = WebSecurity.CurrentUserName).ToList
If user.Count = 1 Then
Dim getAgencies = db.AgencyProfile.Where(Function(Agency) Agency.Active = True).OrderBy(Function(Agency) Agency.Name).ToList
ViewBag.myAgencies = New SelectList(getAgencies, "AgcId", "Name")
user(0).Titles = New myLists().getAgcRepTitles
ViewData("success") = ""
Return View(user(0))
End If
End If
Return RedirectToAction("index", "home")
End Function
<HttpPost()> _
<ValidateAntiForgeryToken()> _
Function Update(agcrep As AgcRep) As ActionResult
If ModelState.IsValid And WebSecurity.IsAuthenticated Then
db.Entry(agcrep).State = EntityState.Modified
db.SaveChanges()
Dim agencies = db.AgencyProfile.Where(Function(Agency) Agency.Active = True).OrderBy(Function(Agency) Agency.Name).ToList
ViewBag.myAgencies = New SelectList(agencies, "AgcId", "Name", agcrep.AgcId.ToString)
agcrep.Titles = New myLists().getAgcRepTitles
ViewData("success") = "changes have been saved"
Else
ViewData("success") = "Update failed. Please try again."
End If
Return View(agcrep)
End Function
知道了!甜蜜的 Jebus 是痛苦的。
事实证明,您不能拥有包含与模型变量同名的变量的 ViewData 或 ViewBag。
一旦我从 View 的顶部移除 Viewbag("title"),我的 Model.Title 就完美地工作了。
在这个问题上卡了 2 天...希望大家能帮忙。
使用 VB.Net 和 MVC4 框架。
我的视图中有一个 Html.DropDownListFor,如下所示:
@Html.DropDownListFor(Function(model) model.Title, New SelectList(Model.Titles, "Key", "Value"), "-select-", New With {.id = "titles", .class = "form-control"})
Model.Titles 是一个 Dictionary(Of String, String) ,这是一个如此短的列表,我宁愿直接从函数而不是数据库中提取它。从这里得到使用字典列表的想法:
我的函数看起来像这样,它作为 Model.Titles
被拉入我的模型Public Function getAgcRepTitles() As Dictionary(Of String, String)
Dim list As New Dictionary(Of String, String)
list.Add("A/D/SGT", "A/D/SGT")
list.Add("A/SGT", "A/SGT")
list.Add("CPL", "CPL")
list.Add("DET", "DET")
Return list
End Function
一切正常,它显示列表并将所选值保存到数据库中。在调试模式下,当我在视图中浏览 DropDownListFor 时,我可以看到 Model.Title 已从数据库中检索到正确的值(例如 "DET"),并且我可以看到 Model.Titles包含我的函数中的上述列表。但是尽我所能,我无法让 DropDownListFor 显示列表中的 Model.Title。
HTML 中的 Select 元素没有选定的选项,但其他方面看起来不错:
<select name="Title" class="form-control">
<option value="">-select-</option>
<option value="A/D/SGT">A/D/SGT</option>
<option value="A/SGT">A/SGT</option>
<option value="CPL">CPL</option>
<option value="DET">DET</option>
</select>
我尝试将 Model.Title 值添加到视图中 SelectList 的 SelectedValue。我试过使用 SelectListItems 列表而不是 Dictionary 并通过 Viewbag.myTitles 将其发送到视图。我试过使用整数作为键值(0、1、2、3 ...)。没有任何效果。
我还应该补充一点,我在同一个视图中还有另一个 DropDownListFor,它运行良好。当你比较它们时......这个从数据库中提取它的列表作为 SelectListItems 到 SelectList(它分别使用值和文本,而不是键和值),其中值是一个从零开始的整数,文本是字符串。
这个真的让我很头疼。
编辑:更多信息。当我提交表单时,修改后的数据成功上传到数据库,Controller将模型数据发回给View。好的....在这个视图中,DropDownListFor 有效!!!但随后我单击刷新,我从 DropDownListFor 中丢失了我选择的值(即使我的模型数据是相同的)。
这是我的控制器:
<AllowAnonymous()> _
Function Update() As ActionResult
If WebSecurity.IsAuthenticated Then
Dim user = db.AgcRepProfile.Where(Function(AgcRep) AgcRep.Email = WebSecurity.CurrentUserName).ToList
If user.Count = 1 Then
Dim getAgencies = db.AgencyProfile.Where(Function(Agency) Agency.Active = True).OrderBy(Function(Agency) Agency.Name).ToList
ViewBag.myAgencies = New SelectList(getAgencies, "AgcId", "Name")
user(0).Titles = New myLists().getAgcRepTitles
ViewData("success") = ""
Return View(user(0))
End If
End If
Return RedirectToAction("index", "home")
End Function
<HttpPost()> _
<ValidateAntiForgeryToken()> _
Function Update(agcrep As AgcRep) As ActionResult
If ModelState.IsValid And WebSecurity.IsAuthenticated Then
db.Entry(agcrep).State = EntityState.Modified
db.SaveChanges()
Dim agencies = db.AgencyProfile.Where(Function(Agency) Agency.Active = True).OrderBy(Function(Agency) Agency.Name).ToList
ViewBag.myAgencies = New SelectList(agencies, "AgcId", "Name", agcrep.AgcId.ToString)
agcrep.Titles = New myLists().getAgcRepTitles
ViewData("success") = "changes have been saved"
Else
ViewData("success") = "Update failed. Please try again."
End If
Return View(agcrep)
End Function
知道了!甜蜜的 Jebus 是痛苦的。
事实证明,您不能拥有包含与模型变量同名的变量的 ViewData 或 ViewBag。
一旦我从 View 的顶部移除 Viewbag("title"),我的 Model.Title 就完美地工作了。