【发布时间】:2015-02-10 22:16:26
【问题描述】:
我和这个玩得很开心。我肯定错过了什么。
我通过 Angular/JSON 将复杂模型发布到 .NET 控制器。将其发布回服务器时,DefaultModelBinder 仅部分绑定到模型(简单的值,例如 int (ID) 和 string (title) 都可以)。 “ListItems”数据集以及作为 ProjectDetails 模型一部分的“ProductsList”数据表似乎被忽略了。根据我正在阅读的内容,对于复杂对象,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 post 对控制器工作正常,它绑定了 ImageID 和 Title。 ListItems 数据集不包含表,并且 ListItems 数据集中的 ProductsList 数据表不存在。
注意:JSON 中的 ProjectStatusCodes 数据未映射回模型,因为它仅用于在表单上显示。
【问题讨论】:
-
复杂对象是否绑定到您发布的表单中的控件是我的第一个问题?其次,您是否阅读过这篇文章并尝试使用 Lists? stackoverflow.com/questions/20554971/…
-
@Bill 感谢您的评论。这是一个 MVC 项目,因此没有绑定控制器或 aspx 网络表单。我添加了带有表单字段的 Angular HTML 模板以进行说明。我阅读了有关列表方法的文章。对于模型的重写,您有什么建议?
-
是的,我知道这是 mvc。在表单中的视图中,您必须将模型属性绑定到表单中的某些内容,以便数据本身在表单发布期间“停留”。对于您的模型重写而不是使用数据集和数据表,我将创建一个实际的类。因此,它类似于属性 List
和属性 List .......... 然后在服务器端,您将有一个用于 LstItem 的类及其属性和一个用于 LstProduct 的类。 -
谢谢比尔。正如我之前提到的,我觉得我对此失去了看法,所以请耐心等待:) 我发布的 JSON 是通过 JSON 帖子成功到达服务器的内容。随后,它通过 AngularJS 2-way binding 绑定到表单。如果它被发布,它会绑定到 Angular 的优点。问题似乎出在 DefaultModelBinder 上。让我感到困惑的是,我已经有一个用于填充表单和 Angular 范围的类,并且在回发时维护了该类结构。 (续)
-
DefaultModelBinder 正在捕获除 ListItems 数据集和 ProductsList 数据表之外的所有内容,即使它显然是通过 JSON 发回的。 DefaultModelBinder 应该能够根据 MSDN 递归地识别和绑定它们。 msdn.microsoft.com/en-us/magazine/hh781022.aspx 谜题的最后一部分似乎在于模型绑定器以及它如何处理数据表/数据集。 (续)
标签: asp.net json vb.net angularjs modelbinder