1

MVC3vb.netアプリケーションに問題があります。コントローラに加えた変更を投稿しようとすると、モデルがコントローラに送信されません。

私はこれこれのような多くの投稿をフォローしようとしましたが、モデルがIEnumerable型を送信しなかったため、アプリケーションにそれらを実装する方法がわかりません。

最後に、モデルがデータベースに保存する値であるバッチごとに1つの値を返すことだけが必要です。

モデルを投稿してコントローラーに送信しようとすると、ページから次の投稿が送信されます。

Client=2&Datacenters=20&BatchesForAssignation[0].CenterID=4&BatchesForAssignation[1].CenterID=20&BatchesForAssignation[1].DatacenterID=14...

しかし、このクエリ文字列をBatchesForAssignationオブジェクトに変換し、モデルに割り当ててコントローラーに送信する方法がわかりません。

注:クエリ文字列に表示されるクライアントデータセンターの値は、コントローラーでは使用されません。BatchesForAssignation[n].CenterID部分が必要です。

これに関する解決策を見つけるために私に指摘してもらえますか?

これは、MVCアプリケーション(コード圧縮)で使用しているオブジェクトです。

バッチ:

Public class Batch
    public property ID as integer
    public property CenterID as integer
    public property name as string
end class

センター(このオブジェクトは、バッチに割り当てられるセンターのすべてのリストを格納するだけです。名前は、ドロップダウンリストに名前を表示するためだけのものです):

Public class Center
    public property ID as integer
    public property name as string
end class

(CollectionBaseから継承されたコレクションとして機能するBatchlistオブジェクトとCenterlistオブジェクトもあり、すべてのBatchオブジェクトとCenterオブジェクトを格納します。クラス定義が必要な場合はお知らせください。ただし、かなり簡単です)。

モデルは以下の通りです

Public class ProcessingModel
    public property BatchesForAssignation as BatchList
    public property Datacenters as CenterList
End class

コントローラは次のとおりです。

<HttpGet()>
<Authorize()> _
Public Function AssignToDataCenters() As ActionResult
    Dim model As New ProcessingModel
    Dim BatchHandler As New BatchControl

    'This line will get the list of batches without datacenter
    model.BatchesForAssignation = BatchHandler.GetBatchesAvailable(ConnectionString)

    'This method will get the list of Datacenters available
    model.Datacenters=BatchHandler.GetDatacenters(ConnectionString)
    return View(model)
End Function

HttpPost(モデルが空のモデルを返すため、これは実際には機能しません):

<HttpPost()>
<Authorize()> _
Public Function AssignToDataCenters(ByVal Model as ProcessingModel) As ActionResult
    Dim BatchHandler As New BatchControl
    Dim SaveResult as Boolean=false

    'This line will get the list of batches without datacenter
    model.BatchesForAssignation = BatchHandler.GetBatchesAvailable(ConnectionString)

    'This method save the information returned by the model
    SaveResult=BatchHandler.UpdateBatches(model)

    ViewBag("Result")=SaveResult
    Return View(model)
End Function

ビューは次のとおりです(強く型付けされたビューです)。

@ModelType MVCAdmin.ProcessingModel

@Code
    ViewData("Title") = "Assign Batches To centers"
End Code

@Using Html.BeginForm()
    @<table id="tblAvailableBatches">
        <thead>
            <tr>
                <th>Assign batch to:</th>
                <th>Name</th>
            </tr>
        </thead>
        <tbody>
            @code
                For i As Integer = 0 To Model.BatchesForAssignation.Count - 1
                    Dim a As Integer = i
                    @<tr>
                        <td>@Html.DropDownListFor(Function(m) m.BatchesForAssignation(a).CenterID, New SelectList(Model.Datacenters, "ID", "name", model.BatchesForAssignation(i).CenterID), " ")</td>
                        <td>@Model.BatchesForAssignation(i).name</td>
                    </tr>        
                Next
            End Code
        </tbody>
    </table>
    <input type="button" value="Apply changes" id="btnApply" />
End Using

前もって感謝します

更新2012-06-14:

request.Formいくつかの再調査を行った後、ビューによって送信された結果を解析できることを使用して、コントローラーでクエリ文字列を解析できることがわかりました。ただし、クエリ文字列キーは、、などの形式にBatchesForAssignation[0].CenterIDなっています。BatchesForAssignation[1].CenterIDBatchesForAssignation[2].CenterID

モデルがクエリ文字列を解析し、解析されたオブジェクトをコントローラーに送信するように、これを「自動的に」行うためのより良い方法はありますか?

もう一度...よろしくお願いします

4

1 に答える 1

1

この質問を確認した後、モデルを作成してコントローラーに送信する最良の方法は、CustomModelBinder(インターフェイスから)を作成し、プロパティを使用してメソッドIModelBinderでフォームのクエリ文字列を解析することであることがわかりました。このようなもの:BindModelcontrollerContext.HttpContext.Request.Form

Public Class ProcessingModelBinder
    implements IModelBinder

    public Function BindModel(controllerContext As System.Web.Mvc.ControllerContext, bindingContext As System.Web.Mvc.ModelBindingContext) As Object
        dim model as ProcessingModel = if(nothing.equals(bindingContext.Model),directcast(bindingContext.Model,directcast(DependencyResolver.Current.GetService(typeof(ProcessingModel))
        dim Keys as string()=controllerContext.HttpContext.Request.Form.AllKeys

        for each key in Keys
            'Fill the model required parameters
        Next

        return model
End Function

そして最後に、新しいモデルビルダーをglobal.asaxファイルに登録します

Sub Application_Start()
    AreaRegistration.RegisterAllAreas()
    ModelBinders.Binders.Add(typeof(ProcessingModel),New ProcessingModelBinder())
    RegisterGlobalFilters(GlobalFilters.Filters)
    RegisterRoutes(RouteTable.Routes)
End Sub

これが誰かに役立つことを願っています

よろしく

于 2012-06-15T15:49:39.257 に答える