1

こんにちは、私は MVC を初めて使用し、これらの投稿を多数調べましたが、問題を解決できませんでした。

dropdownlistfor html ヘルパーを使用してドロップダウン リストを正常に作成しましたが、フォームを送信すると、選択したアイテムの値がモデルとともにアクションの結果に渡されません。つまり、値をデバッグして調べると、ドロップダウンリストのプロパティは何もありません。これが「ModelState.isValid」もfalseを返す原因になっていると思います。

ここに私のモデルがあります:

    Public Class Warranty

        Public Property state As DropDownList

        Private _States As IEnumerable(Of State)
        Public Property States As IEnumerable(Of State)
            Get
                If _States Is Nothing Then
                    _States = GetStates()
                End If
                Return _States
            End Get
            Set(value As IEnumerable(Of State))
                _States = value
            End Set
         End Property

        Public Shared Function GetStates() As List(Of State)
            Dim l As New List(Of State)
            l.Add(New State With {.Value = "none", .Text = "Selected One"})
            l.Add(New State With {.Value = "UT", .Text = "Utah"})
            l.Add(New State With {.Value = "NV", .Text = "Nevada"})
            Return l
        End Function
    End Class

ここに私の状態クラスがあります:

    Public Class State

        Public Property Value As String
        Public Property Text As String
    End Class

これが私のコントローラーメソッドです:

    ' GET: /Warranty
    Function WarrantyRegistration() As ActionResult
        ViewData("Message") = "Warranty Registration Form"
        Dim _statesList As New SoleWebSite.Models.Warranty
        Return View(_statesList)
    End Function

    '

    'POST: /Warranty
    <HttpPost()> _
    Function WarrantyRegistration(ByVal warranty As SoleWebSite.Models.Warranty) As ActionResult
        If ModelState.IsValid Then

            war.state = warranty.state.SelectedItem.Value.ToString()
            //  warranty.state



            db.AddTowarranty_registrations(war)
            db.SaveChanges()
            db.Dispose()

            Return RedirectToAction("WarrantyRegistration")
        End If
        Return View(warranty)
    End Function

これが私の見解です:

    <td>@Html.DropDownListFor(Function(m) m.state, New SelectList(Model.States, "Value", "Text"))</td>

何が間違っているのかわかりません。

すべてを強く型付けしたままにして、可能であればビューバッグやビューデータの使用を避けたいと思います。

任意の提案をいただければ幸いです。

前もって感謝します。

4

1 に答える 1

1

選択された値プロパティは、Stringまたはなどの単純なスカラー型である必要があり、Integerなどの複雑な型ではない必要がありDropDownListます。ちなみに、DropDownList 型は従来の WebForms サーバー側コントロールであり、ASP.NET MVC アプリケーションではまったく関係ありません。System.Web.UI.WebControlsASP.NET MVC アプリケーションでは、名前空間への参照を完全に削除する必要があります。したがってWarranty、単純なタイプを使用します。

Public Property state As String

POST アクションでは、値を読み取るだけです。

<HttpPost()> _
Function WarrantyRegistration(ByVal warranty As SoleWebSite.Models.Warranty) As ActionResult
    If ModelState.IsValid Then
        war.state = warranty.state
        //  warranty.state
        db.AddTowarranty_registrations(war)
        db.SaveChanges()
        db.Dispose()
        Return RedirectToAction("WarrantyRegistration")
    End If
    Return View(warranty)
End Function
于 2012-07-10T17:34:47.003 に答える