0

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

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

ViewData("doctorList") = mySelectItems

现在,在我看来,我正在尝试使用 HTML Helper 将值输入到下拉列表中。

<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 'System.Web.Mvc.Html.SelectExtensions' 中定义的 .Web.Mvc.MvcHtmlString':参数匹配参数 'selectList' 从 'Object' 缩小到 'System.Collections.Generic.IEnumerable(Of 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:

4

1 回答 1

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>
于 2012-08-22T20:30:55.760 回答