0

この投稿を自分のプロジェクトで機能させるのに苦労しています。基本的に、インストール オブジェクトのリスト (インストール オブジェクトには施設オブジェクトのリストが含まれます) をコントローラーに渡します。私はまだバインディングを正常に機能させる必要があります。コントローラーに渡された項目の数を反映するリスト項目の数を取得できましたが、個々のオブジェクトに設定されているプロパティはありません。

投稿を実行するコードは次のとおりです。

$("#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 を逆シリアル化するための追加のコンテナー クラスが不要になるようにします。

4

1 に答える 1

1

Jsonstring を (InstallInputModel の) List にバインドする ModelBinder を作成し、global.asax に登録します。

私の頭の上から(C#):

 public class JsonBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        //return base.BindModel(controllerContext, bindingContext);
        if (controllerContext == null)
        {
            throw new ArgumentNullException("controllerContext");
        }

        if (bindingContext == null)
        {
            throw new ArgumentNullException("bindingContext");
        }


        // Get the JSON data that's been posted
        var request = controllerContext.HttpContext.Request;

        request.InputStream.Seek(0, SeekOrigin.Begin);
        var jsonString = new StreamReader(request.InputStream).ReadToEnd();


        if (jsonString != null)
        {
            var serializer = new JavaScriptSerializer();
            var result = serializer.Deserialize(jsonString, typeof(List<InstallInputModel>));
            return result;

        }
        else
        {
            return null;
        }


    }
}

Global.asax の Application_Start に、次を追加します。

ModelBinders.Binders.Add(typeof(List<InstallInputModel>), new JsonBinder());
于 2013-05-14T16:39:07.283 に答える