DropdownList的selectedValue不会受到来自DB的值的影响

时间:2011-08-01 11:08:09

标签: asp.net-mvc asp.net-mvc-2

这个问题一直让我发疯,星期一早上没有真正的帮助。

我正在加载2个下拉框:

  • 此选项使其选择值受db值

    的影响
    <dd><%= Html.DropDownList("type", New SelectList(ViewData("typeList"), 
        "value", "text", Model.type), New With {.class = ""})%></dd>
    
  • 这个忽略模型中加载的值,并始终在下拉框中显示第一个值

    <dd><%= Html.DropDownList("action", New SelectList(ViewData("actionList"), 
        "value", "text", Model.action), New With {.class = ""})%></dd>    
    

我已经调试了这个页面,并且Model.Action加载了正确的值,但它们从未被分配到selectedvalue。

修改

这是显示页面的ActionResult:

<Authorize()> _
        Public Function Edit(ByVal id As Guid) As ActionResult
            Dim article As Article_Ad = articleAdRepository.GetById(id)

            ViewData("actionList") = GetActionValues()
            ViewData("typeList") = GetTypeValues()

            Return View(article)
        End Function

这些是为下拉框提供的功能:

Private Function GetTypeValues() As IEnumerable(Of SelectListItem)
            Dim list As New List(Of SelectListItem)
            Dim sel As SelectListItem

            'Imagem
            sel = New SelectListItem
            sel.Text = "Imagem"
            sel.Value = "image"
            list.Add(sel)

            'Video
            sel = New SelectListItem
            sel.Text = "Video"
            sel.Value = "video"
            list.Add(sel)

            Return list
        End Function

        Private Function GetActionValues() As IEnumerable(Of SelectListItem)
            Dim list As New List(Of SelectListItem)
            Dim sel As SelectListItem

            ' Call browser window
            sel = New SelectListItem
            sel.Text = "Mostrar Janela"
            sel.Value = 1
            list.Add(sel)

            ' Play fullscreen video
            sel = New SelectListItem
            sel.Text = "Mostrar Video em FullScreen"
            sel.Value = 2
            list.Add(sel)

            ' Show fullscreen picture
            sel = New SelectListItem
            sel.Text = "Mostrar Imagem em FullScreen"
            sel.Value = 3
            list.Add(sel)

            Return list
        End Function

3 个答案:

答案 0 :(得分:1)

您可以尝试设置正确的SelectListItem.Selected值吗?我假设Imagem项应该在下面选择。

Private Function GetTypeValues() As IEnumerable(Of SelectListItem)
    Dim list As New List(Of SelectListItem)
    Dim sel As SelectListItem

    'Imagem
    sel = New SelectListItem
    sel.Text = "Imagem"
    sel.Value = "image"
    sel.Selected = True ' This line has been added
    list.Add(sel)
    '...

    Return list
End Function

答案 1 :(得分:1)

我采用了类似的方法,在我的viewmodel中构建了SelectList,并使用Html.DropDownList从我的视图中引用它。

一个很大的区别是我总是将我的值/文本参数设置为字符串值,即使相应的数据是int。

示例(C# - 抱歉):

private List<SelectListItem> widgets;

public List<SelectListItem> Widgets
{
  get
  {
    if (widgets == null)
    {
      widgets = new List<SelectListItem>();
      widgets.Add(new SelectListItem { Value = "10", Text = "10" });
      widgets.Add(new SelectListItem { Value = "25", Text = "25" });
      widgets.Add(new SelectListItem { Value = "50", Text = "50" });
      widgets.Add(new SelectListItem { Value = "100", Text = "100" });
      widgets.Add(new SelectListItem { Value = "500", Text = "500" });
    }
    return widgets;
  }
  private set { }
}

另一个区别虽然我怀疑这个问题的原因是我强烈地将我的视图输入到视图模型然后直接从视图访问视图模型的SelectList属性,然后将其分配给控制器中的viewdata。看起来您将视图直接绑定到实体(即域模型)。

答案 2 :(得分:1)

我找到了这个问题的答案,说实话,我对最终结果感到有点惭愧。 似乎我在ViewData变量中使用名称“action”,这使得它与下拉框的名称“action”冲突。 将ViewData更改为“actions”(添加“s”)后,它停止了冲突并正确分配了选定的值。

对于遇到与我相同问题的任何人,我的建议是确保没有其他控件使用您指定给对象的相同名称,只是为了安全起见。

感谢大家指点。