회사에서 우리를 위해 개발 한 프로젝트를 따라 잡았지만, 안타깝게도 많은 지원을받지 못하고 장기적으로는 스스로 유지 보수를해야합니다. 애플리케이션은 간단한 웹 클라이언트 (HTTP, JavaScript, Knockout Framework)와 REST API 서비스 (.NET 4.5, ASP.NET MVC)로 구성됩니다.
현재 저는 클라이언트 만 수정하고 있으므로 서버는 여전히 예상대로 작동합니다.
클라이언트 측에서 나는 Knockout View Model을 약간 수정했습니다 (일부 계산 가능하고 일부 값의 최적화 된 표현을 추가했습니다). View Model은 'Issues'와 'Comments'로 구성됩니다 (사실상 버그 추적기 인 이슈 배열). 새 이슈를 생성하면 첫 번째 댓글에 설명이 추가되고 전체 모델은 JSON.stringified이며 .NET API 서비스로 전송됩니다. Firebug를 통해 게시되는 JSON은 다음과 같습니다.
{
"Id":0,
"Title":"THis is a title",
"Comments":[
{
"Id":1,
"Text":"this is the first comment"
}
]
}
클라이언트 측에는 "IssueController"가 있습니다.
[HttpPost]
public HttpResponseMessage PostIssues( Issue issue ) {
//issue should already hold the deserialized content of the JSON here,
//but it only contains 'Id' and 'Title' not the 'Comments' (empty List)
...
}
이슈 도메인 모델 객체는 또한 주석을 보관하기위한 배열을 가지고 있지만,이 부분에서는 이미 비어 있습니다. .NET 코드에는 JSON을 명시 적으로 구문 분석하는 부분이 없습니다. 내가 이해하는 한 MVC 프레임 워크는 동일한 속성 이름으로이를 암시 적으로 수행합니다 (맞습니까?).
역 직렬화는 이미 예상대로 작동 했으므로 .NET 코드는 괜찮을 것입니다.하지만이 암시 적 주석 매핑이 더 이상 작동하지 않는 방식으로 JSON을 수정 한 것 같습니다. 불행히도 저는 .NET MVC 프레임 워크에 대한 경험이 많지 않습니다 (또는 .NET WebAPI 프레임 워크 일 뿐이며 그 사실을 말할 수도 없습니다).
내 질문은 다음과 같습니다.
편집하다
Issue.cs는 다음과 같습니다 (확실히 단순화 됨).
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Bo;
using Projects.DomainObjects;
namespace Projects.Models {
public class Issue : DomainObject {
public Issue() {
this.Comments = new List<Comment>();
}
public long Id { get; set; }
private string _Title;
public string Title { get { return _Title; } set { _Title = value; NotifyChanged(); } }
public List<Comment> Comments { get; set; }
}
Comment.cs :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Common;
using Projects.DomainObjects;
namespace Projects.Models {
public class Comment : DomainObject {
public Comment() {
}
public long Id { get; set; }
public string Text { get; set; }
}
해결 된 문제는 정렬 된 주석 배열을 반환하는 계산이었습니다. 그래서 내 녹아웃 모델에는
self.Comments = ko.observableArray([]); //...which gets filled with the comments of an issue
그리고
self.CommentsSorted = ko.computed(function() {...}); //...which simply returns a sorted Comments array
따라서이 모델을 직렬화 할 때 게시 된 JSON은 이제 Comments
Array와 Array를 나타냅니다 CommentsSorted
. 내가 할 때만
var i = ko.toJS(issue);
delete i.CommentsSorted;
i
데이터로 게시하기 전에 .NET은 Comments
올바르게 역 직렬화 할 수 있습니다.
이것에 대한 신비한 점은 .NET에서 완전히 무시되고 어떤 식 으로든 역 직렬화를 방해하지 않는 녹아웃 모델에 항상 다른 계산 된 필드가 있다는 것입니다. 따라서 주로 모델의 필드 이름과 유형에 따라 달라지는 것 같습니다 (아마도 첫 글자가 동일한 경우).
좋은 점 : 지금 작동합니다. 나쁜 점 : .NET이 JSON 데이터의 역 직렬화를 수행하는 방식이 실제로 결정적이지 않으며 예상대로 작동하지 않는 경우 디버깅 할 수도 없습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다