坚持了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),它是一个很短的列表,我宁愿直接从函数而不是数据库中提取它。有想法从这里使用词典列表:
我的功能看起来像这样,它被作为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
答案 0 :(得分:1)
知道了!甜蜜的耶布斯很痛苦。
事实证明,您不能拥有包含与模型变量同名的变量的ViewData或ViewBag。
一旦我从View顶部移除了Viewbag(&#34;标题&#34;),我的Model.Title就完美无缺。