2012-04-03 5 views
1

나는 다음과 같은 클래스가있다 : 내 SQL Server의웹 API + MVC 4에 대한 모델

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

다음과 같은 데이터가

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

내가 휴식을 만들려고 해요 웹 API를 사용하여 HTTP POST verb를 사용하여 학교 인스턴스를 작성하는 컨트롤러.

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

웹 API가 제대로 내 웹 양식에서 내 학교 클래스의 이름과 약자 속성을 결합하여 컨트롤러에서 POST 메소드를 호출하지만, 국가 클래스와 무엇을 해야할지하지 않습니다. 나는 그것을 설정하는 방법을 잘 모르겠습니다. State 클래스에 바인딩 된 드롭 다운을 만들고 싶습니다. 그리고 학교 생성을 제출하면 기존 데이터의 올바른 상태가 새 학교 인스턴스에 할당됩니다.

+0

어떻게'Store' 클래스의 값을 제출합니까? HTTP 요청 세부 정보 (헤더, 양식 필드 및 값 등)를 게시 할 수 있습니까? – tugberk

+0

동일한 문제가 있습니다. 나는 XML에서 복잡한 형식을 직렬화 해제하고 기본 XmlMediaTypeFormatter 대신 ModelBinders를 시도합니다. JSON이 제대로 작동한다는 언급이 있습니다. XML 또는 JSON 직렬화를 사용하고 있습니까? – Steve

답변

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

안녕하세요 Tugberk, 이전 반복에서는 FK가 포함 된 School의 ViewModel을 사용했습니다. 웹 API가 소개 된 이래로 FK를 사용하지 않고 viewmodel 클래스를 사용하지 않고이 작업을 수행하려고했습니다.이 경우 State와 같은 복잡한 유형을 바인딩 할 수있는 방법이 있기를 바랍니다. 내 질문에 FKs를 사용하지 않고 이런 식으로 구현할 수 있는지, 그렇다면 Post 메서드를 설정하는 방법 및 상태 값을 제출하는 방법입니다. 가능하지 않다면 FK/viewmodel 방식으로 처리해야 할 수도 있습니다. – khaihon

0

을 내 현재 프로젝트 나는 다음 접근법을 사용하여 비슷한 것을 달성했다 :

나는 Device 클래스 (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

희망을.

관련 문제