2012-12-12 36 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> 

這是我的模型

[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; } 
} 

這是我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; 
    } 
} 

所以,從我已經看過這應該工作的每個實例。如果我將api控制器中的對象更改爲FindSubscriber(JObject search),我可以看到我得到了一個JSON字符串。提琴手顯示它正在發送一個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

我發現我的問題是,我的服務器模型有[Serializable]屬性,這樣,當我在Razor視圖序列化它,它也被序列化的支持字段。這應該是顯而易見的,但我錯過了它。所以一旦我發回我的模型,它也會回傳那些綁定字段,從而無法映射到我的模型。 我將此添加到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控制器不會理解這一點。

像這樣的東西應該工作

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對象的所有空值。你確實是正確的@安德斯。我需要指定dataType和contentType。我一直在那裏,但是我一直在嘗試做這麼多事情,現在我忘了把它放回去。謝謝你指出。現在我確實有:'Accept:application/json,text/javascript,*/*; Q = 0.01' –