0

私のコントローラーでは、選択リスト項目を定義し、リストを次のようにビューに渡しました

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

ViewData("doctorList") = mySelectItems

今、私の見解では、HTML ヘルパーを使用して値をドロップダウン リストにフィードしようとしています。

<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) に絞り込まれます)」。'System.Web.Mvc.Html.SelectExtensions' で定義されている拡張メソッド 'Public Function DropDownList(name As String, optionLabel As String) As System.Web.Mvc.MvcHtmlString': 引数一致パラメーター 'optionLabel' は 'Object' から'弦'。G:

4

1 に答える 1

3

キャストしてみてください:

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

ViewBag は動的な型であり、拡張メソッド ( などDropDownList) は動的パラメーターでディスパッチできないため、キャストが必要です。

ところで、これは、私が ViewBag ではなくビュー モデルを使用することを好む数百万の理由の 1 つです。また、ヘルパーの厳密に型指定されたバージョンを使用することもできます。

<%= 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 に答える