2014-11-28 2 views
0

HtmlHelper.DropDownListFor 개체에서 선택된 데이터를 확인하는 방법에 대해 현재 분투하고 있습니다. 문제는 모델을 고유하게 식별 할 수있는 모델 클래스의 단일 속성이 없다는 것입니다.DropDownListFor 값 필드 - 속성 조합 식별자

다음은 내 모델 및 viewmodel 클래스뿐 아니라보기에서 HtmlHelper.DropDownListFor 호출의 샘플입니다.

public class MyModel 
{ 
    public int ParentId { get; set; } // combined with ChildId is the unique identifier 
    public int ChildId { get; set; } // see above 
    public string Name { get; set; } // not unique 
} 

public class MyViewModel 
{ 
    public IEnumerable<MyModel> MyModels { get; set; } 

    public <???> SelectedItem { get; set; } 
} 

@Html.DropDownListFor(m => m.SelectedItem, new SelectList(Model.MyModels, "DataValueField", "Name")) 

문제는 여기에 MyModel의 유일한 독특한 idenfier이 ParentIdChildId조합 것입니다. 그러면 선택한 항목을 고유하게 식별하기 위해 데이터를 검색하는 가장 좋은 방법은 무엇입니까?

ModelUniqueIdentifier = ParentId * 100 + ChildId 

그러나 나는이에 MyViewModel.SelectedItem을 설정하려면이 논리를 적용 할 수있는 방법이 표시되지 않습니다 :

는 다음 (비즈니스 로직)에 비슷한 것이 이러한 모델 객체 중 하나에서 고유 식별자를 구성하려면 .

제출할 양식을 트리거하는 포스트 백이있는 경우 다른 처리를 수행하기 위해 모델의 SelectedItem 속성에서 선택한 값을 가져올 수 있어야합니다. 그러나 1 차원의 "DataValueField"으로, 나는 이것을 달성하는 최선의 방법이 확실하지 않습니다.

이것을 피하는 가장 분명한 방법은 대리 키를 단일 식별자로 데이터에 삽입하는 것입니다. 그러나이 특정 데이터를 사용하면이 시점까지 훌륭한 작업을 해오 고있는이 명백한 복합 자연 키가 있습니다. 내가 데이터에 대리 키를 추가했다 경우이 작업 할 것

ParentId ChildId Name 
7   3  Name1 
4   8  Name2 
5   3  Name3 
4   6  Name4 

:

SurrogateId ParentId ChildId Name 
0   7   3  Name1 
1   4   8  Name2 
2   5   3  Name3 
3   4   6  Name4 

이 작동합니다 반면를 좋아

그래서 두 차원 데이터 보인다 기본 테이블, 모델 및 많은 양의 참조 코드를 변경해야하므로이 대리 키를 추가 할 필요가 없다면 오히려하지 않을 것입니다.

어떤 생각이나 아이디어가 있습니까? 미리 감사드립니다.

+0

귀하가 수락 한 답변으로는 거의 문제를 해결할 수 없습니다. 포스트 백에서 모델을 바인딩 할 수 없으며'Request.Form'에서 가져온 경우 값을 어떻게 'ParentId' 및'ChildId' 값으로 변환하겠습니까? 글 머리 기호를 물고 테이블을 고유 한 ID 필드로 지정하기 위해 데이터베이스를 수정하는 것이 좋지만 [pairing function] (http://en.wikipedia.org/wiki/Pairing_function#Cantor_pairing_function)을 사용할 수 있습니다. –

+0

데이터의 서로 게이트 키, 차례로 모델 클래스 –

답변

1

호출시 고유 ID를 생성하는 모델에서 계산 된 get 속성을 사용해 볼 수 있습니다. 그런 다음 '고유 ID'를 선택 목록/드롭 다운의 데이터 값 필드로 전달하십시오. 예 :

public class MyModel 
{ 
    public int UniqueId { 
     get { 
      return ParentId * 100 + ChildId; 
     } 
    } 
    public int ParentId { get; set; } // combined with ChildId is the unique identifier 
    public int ChildId { get; set; } // see above 
    public string Name { get; set; } // not unique 
} 

SelectItem은이 경우 int입니다.

+0

생각 해 주셔서 감사합니다. 무슨 뜻인지 알겠습니다. 이것은 여전히 ​​내 모델 클래스를 변경해야 할 것입니다. 클래스 정의 자체를 수정하지 않아도된다면 가장 좋을 것입니다. 말이 돼? –

+0

좋아, 모델 클래스에 추가하고 싶지 않은 이유가 있습니까? ParentId 및 ChildId 필드는 무엇을 나타 냅니까? 예를 들어, ParentId와 ChildId는 일종의 왕복 관계입니까? 따라서 ParentId는 다른 레코드의 다른 자식을 참조합니다. 보유하고있는 데이터를 머리 속에 쓰려고합니다. –

+0

나는 대리 키 접근법을 사용하는 것으로 끝났다. 감사! –