使用下拉列表HTML帮助程序时出错

时间:2012-08-22 20:29:24

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

在我的控制器中,我已经定义了选择列表项,并将列表传递给视图

Dim mySelectItems = New List(Of SelectListItem) From {
    New SelectListItem With {.Text = "First item", .Value = "1", .Selected = True}
}

ViewData("doctorList") = mySelectItems

现在,从我的观点来看,我正在尝试使用HTML帮助程序将值提供给DropDown列表。

<label for="appointment_doctor">Select Doctor</label>
<%= Html.DropDownList("doctor", ViewData("doctorList"))%>

现在,我认为这应该有效,但事实并非如此。

错误日志:

  

重载解析失败,因为没有可访问的'DropDownList'   在没有缩小转换的情况下调用:       扩展方法'Public Function DropDownList(name As String,selectList As System.Collections.Generic.IEnumerable(Of   System.Web.Mvc.SelectListItem))As System.Web.Mvc.MvcHtmlString'   在'System.Web.Mvc.Html.SelectExtensions'中定义:参数匹配   参数'selectList'从'Object'缩小到   “System.Collections.Generic.IEnumerable(中   System.Web.Mvc.SelectListItem)”。       扩展方法'Public Function DropDownList(name As String,optionLabel As String)As System.Web.Mvc.MvcHtmlString'在   'System.Web.Mvc.Html.SelectExtensions':参数匹配参数   'optionLabel'从'Object'缩小到   '串'。 G:\ Surgery \ Surgery \ Views \ Appointment \ Index.aspx 11 13手术

1 个答案:

答案 0 :(得分:3)

尝试施放:

<%= Html.DropDownList(
    "doctor", 
    CType(ViewData("doctorList"), IEnumerable(Of SelectListItem)) 
) %>

强制转换是必要的,因为ViewBag是动态类型,并且无法使用动态参数调度扩展方法(例如DropDownList)。

顺便说一句,这是我更喜欢使用视图模型而不是ViewBag的数百万个原因之一。它还允许您使用强类型的帮助程序版本:

<%= Html.DropDownList(
    Function(x) x.SelectedDoctorId, 
    Model.Doctors 
) %>

更新:

根据评论部分的要求,这是一个使用视图模型的完整示例。

与ASP.NET MVC应用程序一样,我们首先定义我们的视图模型类,它将反映您的视图的要求,从您的描述到目前为止,我了解它应该显示医生的下拉列表。您可能显然需要使用其他属性来丰富此视图模型,以反映您的特定视图要求:

Public Class DoctorViewModel
    Property SelectedDoctorId As Integer
    Property Doctors As IEnumerable(Of SelectListItem)
End Class

然后你可以有一个控制器动作来填充这个视图模型并将其传递给视图:

Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Function Index() As ActionResult
        Dim model = New DoctorViewModel()

        ' TODO: those could come from a database or something
        ' I am hardcoding the values here for better understanding
        model.Doctors = {
            New SelectListItem With {.Value = "1", .Text = "doctor 1"},
            New SelectListItem With {.Value = "2", .Text = "doctor 2"},
            New SelectListItem With {.Value = "3", .Text = "doctor 3"}
        }

        Return View(model)
    End Function
End Class

最后你会有一个相应的强类型视图(~/Views/Home/Index.aspx):

<%@ Page 
    Language="VB" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage(Of ToDD.DoctorViewModel)" %>

<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
    Home Page
</asp:Content>

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">

    <%= Html.DropDownListFor(Function(x) x.SelectedDoctorId, Model.Doctors) %>

</asp:Content>