2017-09-18 128 views
2

我重新編程了Angular 2英雄教程,以便在具有Web API的ASP.NET Web應用程序中運行,並與該Web API(而不是內存Web API)通信。 一切正常。只有一個問題仍然存在:將C#ASPNET WebApi對象的屬性映射到Angular 2,

在ASP.NET的服務環境和Angular環境中,我使用對象Hero。 C#對象中屬性的命名約定是用大寫字母開始一個屬性名稱。 JS中的命名約定是以小寫字母開頭的屬性名稱。我更願意在我的編碼中遵循這個約定。 如果我這樣做,當然對象在接收站點不再適當的反序列化。 通常如何處理這個?

的get(數組)在ASP.NET控制器:

// GET api/heroes 
public HttpResponseMessage Get() 
{ 
    String heros = JsonConvert.SerializeObject(GetHeroes().ToArray<Hero>()); 
    return new HttpResponseMessage() 
    { 
    Content = new StringContent(heros, System.Text.Encoding.UTF8, "application/json") 
    }; 
} 

GetHeroes()返回英雄的列表:

public class Hero 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
} 

在hero.service.ts的代碼:

getHeroes(): Promise<Hero[]> { 
    return this.http.get(this.heroesUrl) 
     .toPromise() 
     .then(response => response.json() as Hero[]) 
     .catch(this.handleError); } 

最後的英雄類hero.ts:

export class Hero { id: number; name: string;} 

的Web服務提供了獲取原始代碼是:

[{"id":0,"name":"Zero"},{"id":11,"name":"Mr. Nice"},{"id":12,"name":"Narco"},{"id":13,"name":"Bombasto"},{"id":14,"name":"Celeritas"},{"id":15,"name":"Magneta"}] 

的問題是我怎麼能繼續使用在C#(這個現在造成的問題)

public class Hero 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

如果我這樣做這我沒有得到任何錯誤。它只是返回在瀏覽器中的6個對象,只將記錄內容不displayed.Like這樣的:

browser results

+0

正如我的經驗,從c#到Angular的屬性映射不區分大小寫。只要拼寫對屬性正確,它不應該導致任何問題。你有什麼錯誤嗎? –

+0

不區分大小寫?有趣。 要回答你的問題:我沒有得到任何錯誤。它只是返回瀏覽器中的6個對象,只顯示記錄的內容。這意味着對象被反序列化,只有屬性不匹配。 –

回答

5

試試這個

public class Hero 
{ 
    [JsonProperty(PropertyName = "id")] 
    public int Id { get; set; } 
    [JsonProperty(PropertyName = "name")] 
    public string Name { get; set; } 
} 

文檔Serialization Attributes

+0

問題解決了!謝謝 –

+0

如果這解決了問題,請將其標記爲已接受的答案,謝謝 –

+0

不能,因爲我沒有足夠的「信譽點」arghhh ..一切想問的問題已經被問到......可以'甚至關閉這個問題。 –

2

添加下列內容Application.Start在Global.asax.cs中。這將強制Json序列化爲駱駝事件。

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings 
     { 
      Formatting = Formatting.Indented, 
      TypeNameHandling = TypeNameHandling.Objects, 
      ContractResolver = new CamelCasePropertyNamesContractResolver() 
     }; 
相關問題