.Net模型通过JSON帖子绑定数据集

时间:2015-02-10 22:16:27

标签: asp.net json vb.net angularjs modelbinder

我对这个问题感到非常兴奋。我肯定错过了什么。

我通过Angular / JSON将复杂模型发布到.NET控制器。将其发布回服务器时,DefaultModelBinder仅部分绑定到模型(简单值,如int(ID)和string(title)都可以)。 " ListItems"似乎忽略了数据集以及" ProductsList"数据表,它是ProjectDetails模型的一部分。从我正在阅读的内容来看,对于复杂对象,DefaultModelBinder以递归方式在JSON处进行第二次传递,然后映射它可以找到的对象。我尝试过通过搜索StackOverflow找到的一些解决方案,但无济于事。我想我现在已经失去了我的观点。这就是我所拥有的。任何帮助将不胜感激。

模型

    Public Class ProjectDetails

    Private _ListItems As DataSet
    <JsonProperty("ListItems")> _
    Public Property ListItems() As DataSet
        Get
            Return _ListItems
        End Get
        Set(ByVal value As DataSet)
            _ListItems = value
        End Set
    End Property

    Private _ProductsList As DataTable
    Public Property ProductsList As DataTable
        Get
            Return _ProductsList
        End Get
        Set(value As DataTable)
            _ProductsList = value
        End Set
    End Property

    Private _imageID As Int32 = 0
    Public Property imageID() As Int32
        Get
            Return _imageID
        End Get
        Set(ByVal value As Int32)
            _imageID = value
        End Set
    End Property

    Private _Title As String = String.Empty
    Public Property Title() As String
        Get
            Return _Title
        End Get
        Set(ByVal value As String)
            _Title = value
        End Set
    End Property
    End Class

动作控制器

    <Authorize()> _
    <AcceptVerbs(HttpVerbs.Post)> _
    <ValidateInput(False)> _
    Async Function ProjectUpdate(ByVal d As ProjectDetails) As Task(Of JsonResult)
    'send results to database here
    Save(d)
    return json(true)
    End Function

标题

    POST http://localhost:51110/projectUpdate HTTP/1.1
    Host: localhost:51110
    Connection: keep-alive
    Content-Length: 10119
    Accept: application/json, text/plain, */*
    User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36
    Content-Type: application/json;charset=UTF-8
    Accept-Encoding: gzip, deflate
    Accept-Language: en-US,en;q=0.8

发布了JSON数据

    {"ListItems":

    {"ProjectStatusCodes":[{"id":1,"ProjectStatusTx":"Stage1 - Under Construction"},{"id":3,"ProjectStatusTx":"Stage3 - Project Released"},{"id":4,"ProjectStatusTx":"Project Closed"}],

    "ProductsList":[
    {"id":2336,"Name":"Product1","Description":"This is a description","$$hashKey":"00K"},
    {"id":2337,"Name":"Product2","Description":"This is a second description","$$hashKey":"00M"}],

    "imageID":345,
    "Title":"books", }
    }

AngularJS代码

    $scope.update = function (formData) {
    $http({
        method: 'POST',
        url: '/projectbuilder/projectUpdate',
       contentType: 'application/json; charset=utf-8',
        data: JSON.stringify($scope.formData)
    }).success(function (data, status, headers, config) {
        $scope.codeStatus = status;
    }).error(function (data, status, headers, config) {
        $scope.codeStatus = status || "Request failed";

    });

包含表单值的HTML模板

    <div ng-repeat="ProductsList in formData.ListItems.ProductsList">
        <div>
          <div>
            <div>
               <input value="{{ProductsList.Title}}" name="ProductsList.Title" ID="ProductsList.Title" ng-model="ProductsList.Title" >
               <br />
               <input value="{{ProductsList.ImageID}}" name="ProductsList.ImageID" ID="ProductsList.ImageID" ng-model="ProductsList.ImageID" >
            </div>
         </div>
    </div>

行为 JSON帖子对控制器工作正常,它绑定了ImageID和Title。 ListItems数据集不包含表,并且ListItems数据集中的ProductsList数据表不存在。

注意:JSON中的ProjectStatusCodes数据未映射回模型,因为它仅用于表单上的显示。

2 个答案:

答案 0 :(得分:0)

如果它试图将你的json中的“ListItems”序列化为一个列表对象,它可能会导致问题,因为你的json中没有括号,即使它只是列表中的一个对象:

  {"ListItems":[ 
         {
             "ProjectStatusCodes":[{"id":1,"ProjectStatusTx":"Stage1 - Under Construction"},{"id":3,"ProjectStatusTx":"Stage3 - Project Released"},{"id":4,"ProjectStatusTx":"Project Closed"}],
             "ProductsList":[{"id":2336,"Name":"Product1","Description":"This is a description","$$hashKey":"00K"},{"id":2337,"Name":"Product2","Description":"This is a second description","$$hashKey":"00M"}],
             "imageID":345,
             "Title":"books"
         } 
  ]}

答案 1 :(得分:0)

行。我想到了。似乎JSON.NET在发送时确保它完全符合JSON标准,可以很好地序列化对象。坏消息是,当将数据发送回.NET应用程序时,它会删除使数据表可序列化的大部分内容。

我最终做的是在回发上捕获JSON字符串并使用您可以在此处找到的JSON.NET片段序列分别访问序列化数据表数据。 http://www.newtonsoft.com/json/help/html/SerializingJSONFragments.htm我离开了对象的其余部分&#34;按原样#34;并从JSON字符串中获取数据表,并使用此技术手动执行反序列化。文章中的例子非常有用。

阅读JSON STRING的代码

    Dim req As Stream = Request.InputStream
    req.Seek(0, System.IO.SeekOrigin.Begin)
    Dim jsonstring As String = New StreamReader(req).ReadToEnd()

解决问题和解决问题的代码

    Dim ProductsList As JObject = JObject.Parse(jsonstring)
    Dim results As IList(Of JToken) = ProductsList("ListItems")("ProductsList").Children().ToList()

    Console.Write(results)

不是非常优雅,但它有效。