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) ,这是一个如此短的列表,我宁愿直接从函数而不是数据库中提取它。从这里得到使用字典列表的想法:

http://nimblegecko.com/dropdownlistfor-with-dictionaries-in-ASP-NET-MVC-and-why-SelectList-wants-to-kill-you/

我的函数看起来像这样,它作为 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 就完美地工作了。