2013-01-03 3 views
1

icollection 유형의 속성이있는 모델이 있습니다.MVC3 :보기에서 컨트롤러로 ICollection 전달

public class myClass{ 
    public string param1{get; set;} 
    public string param2{get; set;} 
    public virtual ICollection<myClass2> param3{get; set;} 

    public myClass() 
    { 
     param3 = new hashSet<myClass2>(); 
    } 

} 

public class myClass2{ 
    public string param4{get; set;} 
    public string param5{get; set;} 
    public virtual myClass param6{get; set;} 
} 

는 내가보기에이 두 클래스를 포함하는 모델을 통과

foreach(var item in Model.myClass.param3)를 사용하여 내 ICollection에있는 항목을 볼 수 있어요 그리고 내 컨트롤러를 검색하는 숨겨진 필드의 항목을 저장할 내가 양식을 제출하고 컨트롤러 모델을 통과 할 때 model.myClass.param3를 호출 할 때

foreach(var item in Model.myClass.param3){ 
     @Html.HiddenFor(model => item.parm4); 
     @Html.HiddenFor(model => item.parm5); 
} 

는, 나는 카운트 = 0을 얻는다.

내보기에 ICollection을 전달하려면 어떻게해야합니까? this link을 시도했지만 왜 작동하지 않는지 모릅니다.

편집

링크 (나는 목록에 ICollection에 캐스팅해야합니다 제안) 색인을 위해 목록으로 클래스 책을 사용합니다. 어떻게해야합니까? 또한 목록에 캐스트하면 컨트롤러에서 ICollectiion을 수신 할 때 컨트롤러에 전달하는 방법은 무엇입니까?

+0

연결된 [문서] (http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx)에서는 방법을 설명합니다. 그걸 바탕으로 시도한 것을 게시 할 수 있습니까? – nemesv

답변

1

foreach 루프를 사용할 수 없으므로 for 루프를 사용해야합니다.

for (int i=0; i<Model.MyClass.param3.Count; i++) 
    { 
     @Html.HiddenFor(model => model.MyClass.param3[i]) 
    } 

그 이유는 HiddenFor 도우미가 작동하려면 바인딩 모델에 대한 각 필드에 고유 한 이름을 할당하는 몇 가지 방법이 필요하다. i 변수가이를 수행합니다.

귀하의 경우에는 구현을 위해 일부 리팩토링이 필요합니다. ICollection 또는 HashSet은 색인 생성을 지원하지 않으므로 색인 생성을 지원하는 List 또는 일부 모음으로 변환해야합니다.

해당 주제의 this excellent blog post을 참조하십시오.

+0

그래, 나도 그렇게 생각했다.하지만 모델 .MyClass.param3 [i]는 param3이 목록 일 경우 작동한다. 하지만 내 것은 ICollection이므로 다음과 같은 오류가 발생합니다. []을 (를) 사용하여 인덱스를 system.collection.generic.icollection 유형에 적용 할 수 없습니다. – jpo

+0

올바른 이유는 목록에 캐스팅해야한다고 말한 이유입니다. 색인 생성을 지원하는 컬렉션 –

+0

편집을 참조하십시오 – jpo

관련 문제