knockout.js 라이브러리 및 knockout.mapping.js 라이브러리를 MVC4 애플리케이션에서 작동 시키려고합니다. 내가보기를 생성하는 컨트롤러를 사용하고 있습니다. 면도기 뷰는 모델을 JSON 문자열로 변환 한 다음 매핑 플러그인을 사용하여 내 MV에서 JSON 모델을 가져옵니다. 그 부분은 모두 잘 작동합니다. 컨트롤러의 일부 모델에 값을 추가하면 내 뷰에 표시됩니다. 내가 겪고있는 문제는 나에게 WebApi 컨트롤러를 다시 보내는 것이다. 일단 거기서 얻으면 다시 직렬화 가능 모델로 변환되지 않습니다. 여기에 내가 무엇을 가지고 :knockout.mapping JSON으로 돌아가서 객체로 다시 변환하지 않는 API 컨트롤러
<script type="text/javascript" src="/Scripts/knockout-2.1.0.debug.js"></script>
<script type="text/javascript" src="/Scripts/knockout.mapping-latest.debug.js"></script>
<script type="text/javascript">
function SearchModel() {
var self = this;
var baseUri = '/Api/searchsubscriber/FindSubscriber';
self.search = function (formElement) {
debugger;
var myJSONString = JSON.stringify(ko.mapping.toJS(formElement));
alert(myJSONString);
$.ajax({
type: "POST",
url: baseUri,
data: myJSONString
}).done(updateSearchResults);
};
updateSearchResults = function (data) {
debugger;
var jsonString = JSON.stringify(data);
alert(jsonString);
};
};
$(function() {
debugger;
//in my actualy view it looks like this
//var jsonModel = '@Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(this.Model))';
var jsonModel = '{"SubscriberNum":null,"PersonCode":null,"ClientCode":null,"LastName":"TEST","FirstName":"H","MI":null,"DOB":null,"StartDt":null,"EndDt":null,"GroupNum":null}';
var mvcModel = ko.mapping.fromJSON(jsonModel);
var myViewModel = new SearchModel();
var g = ko.mapping.fromJS(myViewModel, mvcModel);
ko.applyBindings(g);
});
</script><code>
이이 내가 작업을해야이 살펴 보았다 모든 예에서 그래서 내 ApiController
[Authorize]
public class SearchSubscriberController : ApiController
{
MyService _service = new MyService();
[HttpPost]
public SearchSubscriberFields FindSubscriber(SearchSubscriberFields search)
{
if (search != null)
{
SearchSubscribersRequest request = new SearchSubscribersRequest();
request.Credentials = new Credentials() { Username = User.Identity.Name };
request.SubscriberNum = Utility.FormatString(search.SubscriberNum).ToUpper();
request.PersonCode = Utility.FormatString(search.PersonCode).ToUpper();
request.ClientCode = Utility.FormatString(search.ClientCode).ToUpper();
request.LastName = Utility.FormatString(search.LastName).ToUpper();
request.FirstName = Utility.FormatString(search.FirstName).ToUpper();
request.MI = Utility.FormatString(search.MI).ToUpper();
SearchSubscribersResponse response = _service.SearchSubscribers(request);
if (response.Errors.Count < 1)
{
return search;
}
}
return search;
}
}
, 내 모델
[Serializable]
public class SearchSubscriberFields //: SearchSubscriberResults
{
//public List<SearchSubscriberResults> Results { get; set; }
public string SubscriberNum { get; set; }
public string PersonCode { get; set; }
public string ClientCode { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public string MI { get; set; }
public string DOB { get; set; }
public string StartDt { get; set; }
public string EndDt { get; set; }
public string GroupNum { get; set; }
}
입니다. API 컨트롤러의 객체를 FindSubscriber(JObject search)
으로 변경하면 JSON 문자열이 표시됩니다. Fiddler가 JSON 문자열을 보내고 있음을 보여줍니다. 피들러에서 는 :
POST http://localhost:60248/Api/searchsubscriber/FindSubscriber HTTP/1.1
Accept: */*
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
Referer: http://localhost:60248/Subscriber/Search
Accept-Language: en-US,es-DO;q=0.5
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Host: localhost:60248
Content-Length: 157
Connection: Keep-Alive
Pragma: no-cache
{"SubscriberNum":null,"PersonCode":null,"ClientCode":null,"LastName":"TEST","FirstName":"H","MI":null,"DOB":null,"StartDt":null,"EndDt":null,"GroupNum":null}
난 그냥 내가 다시 SearchSubscriberFields
객체로 얻을 수 있습니다 내 컨트롤러의 결과를 얻고 있지 않다.
모든 아이디어를 매우 높이 평가합니다.
시도해 보니 문제가 해결되지 않았습니다. 내 컨트롤러에서 여전히 내 SearchSubscriberFields 개체에 대해 모든 null 값을 가져옵니다. 당신은 틀림없이 @Anders입니다. dataType 및 contentType을 지정해야합니다. 나는 거기에 그것을 한 번에 가지고 있지만, 나는 이것을 다시 넣는 것을 잊어 버린 지금이 일을하기 위해 많은 것들을 시도해왔다. 그것을 지적 해 주셔서 고마워. 이제 저는 다음과 같은 작업을했습니다 :'Accept : application/json, text/javascript, */*; q = 0.01' –