2012-12-12 1 views
3

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 객체로 얻을 수 있습니다 내 컨트롤러의 결과를 얻고 있지 않다.

모든 아이디어를 매우 높이 평가합니다.

답변

1

작동합니다 . 그것은 분명해야하지만 나는 그것을 놓쳤다. 그래서 내 모델을 게시하고 나면 바인딩 필드를 게시하여 내 모델에 매핑하는 것을 불가능하게 만들었습니다. Global.asmx에 추가했습니다.

 //This sets the JSON serializer to ignore the backing fields 
     JsonSerializerSettings jSettings = new Newtonsoft.Json.JsonSerializerSettings(); 
     GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = jSettings; 
1

ko.mapping.toJSON을 사용해야합니다. jQuery.Ajax를 올바르게 구성해야합니다. 이제 html 양식처럼 게시 할 것이므로 MVC Controller는 이해하지 못할 것입니다.

이런 식으로 뭔가 내가 내 문제는 내 면도기보기에서 직렬화 할 때 그것은 또한 백업 필드를 직렬화 된 있도록 내 서버 모델은 [직렬화] 속성을 가지고 것을 것을 발견했다

MyApp.utils = { 
    post: function (url, data, success) { 
     $.ajax({ 
      url: url, 
      type: "POST", 
      dataType: "JSON", 
      contentType: "application/json; charset=UTF-8", 
      data: ko.mapping.toJSON(data), 
      success: success 
     }); 
    } 
}; 
+0

시도해 보니 문제가 해결되지 않았습니다. 내 컨트롤러에서 여전히 내 SearchSubscriberFields 개체에 대해 모든 null 값을 가져옵니다. 당신은 틀림없이 @Anders입니다. dataType 및 contentType을 지정해야합니다. 나는 거기에 그것을 한 번에 가지고 있지만, 나는 이것을 다시 넣는 것을 잊어 버린 지금이 일을하기 위해 많은 것들을 시도해왔다. 그것을 지적 해 주셔서 고마워. 이제 저는 다음과 같은 작업을했습니다 :'Accept : application/json, text/javascript, */*; q = 0.01' –

관련 문제