2012-04-03 65 views
1

我有以下類別:的Web API + 4 MVC模型方面的複雜類型結合

public class State 
{ 
    public long Id     { get; set; } 
    public string Name    { get; set; } 
    public string Abbreviation  { get; set; } 

    // Navigation Properties 
    public virtual Country Country { get; set; } 
} 

public class School 
{ 
    public long Id     { get; set; } 
    public string Name    { get; set; } 
    public string Abbreviation  { get; set; } 

    // Navigation Properties 
    public virtual State State  { get; set; } 
} 

,後面的數據在我的SQL Server

| School|    |    | 
| Id | Name  | State  | 
| 1 | UCLA  |  1  | 
+-------+-------------+---------------+ 
| State |    |    | 
| Id | Name  | Abbreviation | 
| 1 | California |  CA  | 

我試圖創建一個休息控制器,該控制器使用Web API使用HTTP POST動詞創建學校實例。

public HttpResponseMessage<School> Post(School school) 
{ 
    SchoolService.CreateSchool(school); 
    var response = new HttpResponseMessage<School>(school, HttpStatusCode.Created); 
    string uri = Url.Route(null, new { id = school.Id }); 

    response.Headers.Location = new Uri(Request.RequestUri, uri); 
    return response; 
} 

的Web API正確地從我的網頁形式結合我校類的名稱和縮寫屬性和調用控制器中的POST方法,但它不知道如何處理國家類做。我不太清楚如何設置。我希望有一個綁定到國家班級的下拉菜單,當我提交學校的創建時,我現有數據中的正確狀態將被分配到新的學校實例。

+0

如何提交'Store'類的值?你能發佈HTTP請求細節(標題,表單域和值等)嗎? – tugberk 2012-04-04 08:28:05

+0

我遇到同樣的問題;我是在一個POST中反序列化一個複雜類型的XML,它會嘗試使用ModelBinders而不是默認的XmlMediaTypeFormatter。有人提到JSON可以正常工作 - 您是使用XML還是JSON序列化? – Steve 2012-04-25 15:34:07

回答

1

首先,您的領域模型設計有點粗糙。你School表應該有一個FKState表,你應該有你的POCO類中還有:

public class School 
{ 
    public long Id     { get; set; } 
    public long StateId    { get; set; } 
    public string Name    { get; set; } 
    public string Abbreviation  { get; set; } 

    // Navigation Properties 
    public virtual State State  { get; set; } 
} 

那麼你應該有類似於以下表單域:

<select id="StateId" name="StateId"> 
    <option value="">Select a State</option> 
    <option value="310">CA</option> 
    <option value="311">NY</option> 
</select> 
+0

Hi Tugberk, 在我以前的迭代中,我將有一個包含FK的School的ViewModel。自引入Web API以來,我想試圖在不使用FK的情況下完成此操作,並且完全不使用視圖模型類,希望能夠以某種方式綁定複雜類型,例如在此情況下的狀態。我想我的問題是,如果可以在不使用FK的情況下以這種方式實現它,那麼如何設置Post方法以及如何提交狀態值。如果不可能的話,我可能不得不結束FK/viewmodel的方式。 – khaihon 2012-04-04 16:52:29

0

在我目前的項目我已經實現了類似的使用以下方法:

我有一個設備類(POCO)和一個DeviceCommand類(POCO)。設備可以有很多命令,每個命令只有一個設備。

我沒有打擾ViewModel和層之間使用POCO類。

public class Device 
{ 
    [Key] 
    public int ID { get; set; } 

    public int DeviceID { get; set; } 

    public bool IsActive { get; set; } 

    // Navigational properties 
    public ICollection<DeviceCommand> CommandList { get; set; } 
} 

而且

public class DeviceCommand 
{ 
    public int Id { get; set; } 

    public string CommandText { get; set; } 
    public string CommandId { get; set; } 

    // Navigational properties 
    public int DeviceId { get; set; } 
    public Device Device { get; set; } 
} 

而且在我的DbContext派生類中我有下面的代碼:

protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) 
    {   
     modelBuilder.Entity<DeviceCommand>() 
      .HasRequired(d => d.Device) 
      .WithMany(l => l.CommandList) 
      .HasForeignKey(b => b.DeviceId) 
      .WillCascadeOnDelete(); 
    } 

IMO你必須建立一個外鍵關係或者使用註釋或流暢API。

如果POST方法中的參數沒有它的屬性,那麼純粹決定參數的.NET類型。「簡單類型」使用模型綁定。複雜類型使用格式化程序。

請參考以下鏈接瞭解網頁API結合更好:

http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

希望這有助於。