2012-04-03 73 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

希望这有助于。