この投稿を自分のプロジェクトで機能させるのに苦労しています。基本的に、インストール オブジェクトのリスト (インストール オブジェクトには施設オブジェクトのリストが含まれます) をコントローラーに渡します。私はまだバインディングを正常に機能させる必要があります。コントローラーに渡された項目の数を反映するリスト項目の数を取得できましたが、個々のオブジェクトに設定されているプロパティはありません。
投稿を実行するコードは次のとおりです。
$("#OpenFacilityResults").button().click(function () {
var installHolder = {
InstallList: []
}
var foundInstall = false
$('.FullExport').each(function () {
//var Install = { InstallRecnum: 0, FacilityList: [Facility, Facility] }
//var Facility = { ID: 0, Product: 0 }
if ($(this).prop('checked')) {
var substr = $(this).parent().find('input:hidden').val().split('|');
var fac = {
ID: substr[1],
Product: substr[2]
}
foundInstall = false
$.each(installHolder.InstallList, function (index, value) {
if (value.InstallRecnum == substr[0]) {
foundInstall = true
installHolder.InstallList[index].FacilityList.push(fac);
}
});
if (foundInstall == false) {
var i = {
InstallRecnum: substr[0],
FacilityList: []
}
i.FacilityList.push(fac)
installHolder.InstallList.push(i)
}
}
});
console.log(JSON.stringify(installHolder));
var dataHolder = JSON.stringify(installHolder)
$.ajax({
url: '@Url.Action("ViewFacilityDetails", "CHI")',
type: 'POST',
dataType: 'json',
data: dataHolder,
contentType: 'application/json',
success: function (data) {
// get the result and do some magic with it
}
});
});
JSON は次のようになります。
{"InstallList":[{"InstallRecnum":"140","FacilityList":[{"ID":"0","Product":"1"}]},{"InstallRecnum":"138","FacilityList":[{"ID":"0","Product":"1"}]}]}
コントローラーのアクションは次のとおりです。
Function ViewFacilityDetails(ByVal InstallList As List(Of InstallInputModel)) As ActionResult
Return Json(InstallList)
End Function
そして、私がバインドしようとしているオブジェクト:
<Serializable()> _
Public Class InstallInputModel
Public InstallRecnum As Integer
Public FacilityList As List(Of FacilityInputModel)
End Class
<Serializable()> _
Public Class FacilityInputModel
Public ID As Integer
Public Product As Integer
End Class
どんな助けでも大歓迎です-事前に感謝します!
アップデート
これを実現する作業コードは次のとおりです。
カスタムモデルバインダー:
Public Class JsonBinder
Implements IModelBinder
Public Function BindModel(controllerContext As System.Web.Mvc.ControllerContext, bindingContext As System.Web.Mvc.ModelBindingContext) As Object Implements System.Web.Mvc.IModelBinder.BindModel
If controllerContext Is Nothing Then
Throw New ArgumentNullException
End If
If bindingContext Is Nothing Then
Throw New ArgumentNullException
End If
Dim request = controllerContext.HttpContext.Request
request.InputStream.Seek(0, IO.SeekOrigin.Begin)
Dim jsonString = New StreamReader(request.InputStream).ReadToEnd
If Not jsonString Is Nothing Then
Dim deserializer As New System.Web.Script.Serialization.JavaScriptSerializer
Dim result = deserializer.Deserialize(Of InstallInputModelHolder)(jsonString)
Return result
Else
Return Nothing
End If
End Function
End Class
※Gloabl.asax.vb追加※
ModelBinders.Binders.Add(GetType(InstallInputModelHolder), New JsonBinder())
おそらく、JSON を変更して、配列を渡すだけで、JSON を逆シリアル化するための追加のコンテナー クラスが不要になるようにします。