未选中所选值的html.dropdownlist

时间:2016-04-19 02:17:55

标签: vb.net asp.net-mvc-4 dropdownlistfor

坚持了2天......希望你们能帮忙。

将VB.Net与MVC4框架结合使用。

我的View中有一个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

一切正常,它会显示列表并将所选值保存到数据库中。在调试模式下,当我在View中浏览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值添加到View中SelectList的SelectedValue。我尝试使用SelectListItems列表而不是Dictionary,并通过Viewbag.myTitles将其发送到View。我已经尝试使用整数作为Key值(0,1,2,3 ...)。什么都行不通。

我还应该补充一点,我在同一个View中有另一个完美的DropDownListFor。当你比较它们时....这个将它的列表从数据库中拉出来作为SelectListItems到一个SelectList(它分别使用Value和Text,而不是Key和Value),其中Value是一个从零开始的整数,Text是字符串

真的用这个敲我的头。

编辑:更多信息。当我提交表单时,修改后的数据成功上传到数据库,Controller将模型数据发送回View。好的....在这个视图中DropDownListFor工作!!!但后来我点击刷新,我从DropDownListFor中丢失了我选择的值(即使我的模型数据是IDENTICAL)。

这是我的控制器:

 <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

1 个答案:

答案 0 :(得分:1)

知道了!甜蜜的耶布斯很痛苦。

事实证明,您不能拥有包含与模型变量同名的变量的ViewData或ViewBag。

一旦我从View顶部移除了Viewbag(&#34;标题&#34;),我的Model.Title就完美无缺。