문제

2011-04-28 8 views
20

나는 이상한 문제 (어쨌든 나에게) 무슨 표시가 ... 문제

은 내가 ~/조회/공유에 SelectListItem에 대한 간단한 편집기 템플릿 (SelectListItem.cshtml를 생성 예를 들어/EditorTemplates 폴더) : c.Categories이는 괜찮 았는데를 IEnumerable

입니다,하지만 약간 다른 마크 업 컬렉션을 렌더링하는 다른 템플릿을 원했다, 그래서 복사하고 이름을 변경

<ul class="select-list-item cell-15 col-3 omega clearfix"> 
    @Html.EditorFor(c => c.Categories) 
</ul> 

편집기 템플릿 (예 : 'CategoryIcons.cshtm') '다음과 같이 호출됩니다 :

<ul class="select-list-item cell-15 col-3 omega clearfix"> 
    @Html.EditorFor(c => c.Categories, "CategoryIcons") 
</ul> 

즉, 유일한 차이점은 이름이 지정된 편집기 템플릿을 지정하는 것입니다. 두 템플릿 ID에

The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[System.Web.Mvc.SelectListItem]', but this dictionary requires a model item of type 'System.Web.Mvc.SelectListItem'

템플릿의 모델 선언 : 나는 페이지를 열 때

, 이제 다음과 같은 오류가

@model System.Web.Mvc.SelectListItem 

는 이해가 안 돼요 왜 기본 템플릿 작품과 명명 된 템플릿 않습니다. 어떤 도움을 주시면 감사하겠습니다.

감사합니다.

답변

29

@Html.EditorFor(c => c.Categories)으로 전화를 걸면 IEnumerable의 기본 템플릿으로 되돌아갑니다. 이 기본 템플릿은 MVC 프레임 워크에서 제공하며 해당 동작은 열거 형의 각 항목에 대해 Html.EditorFor()을 출력합니다. 그러면 해당 목록의 각 항목에 대한 적절한 편집기 템플릿이 개별적으로 표시됩니다. 귀하의 경우 모든 인스턴스가 SelectListItem이므로 첫 번째 경우에는 SelectListItem 템플릿이 각 항목에 사용됩니다. 두 번째 경우

, 명시 적으로 특정 편집기 템플릿 CategoryIcons를 사용하도록 EditorFor를 설정하여, 대신 열거를 허용하는의 전체 열거 동안 그 편집기 템플릿을 사용하도록 말하고있다가에서 기본적으로 템플릿 수 열거 된 각 항목에 대해 템플릿을 사용하여 전환하십시오.

저는 아직이 문제를 해결하기위한 최선의 방법이 확실하지 않습니다.

한 가지 방법은 CategoryIcon의 명시적인 템플릿을 참조하여, 단순히 Model 열거를 foreaches, 각 항목에 대한 Html.EditorFor 수행 누구의 모델 IEnumerable<CategoryIcon>의 인스턴스 인 CategoryIcons 템플릿을 정의하는 것입니다. 그런 다음 템플릿에 항목 별 편집기 템플릿을 넣습니다 (CategoryIconCategoryIcons). 그런 다음 @Html.EditorFor(c => c.Categories, "CategoryIcons")을 사용하여이 전화를 걸 수 있습니다.

이 작업을 수행하는 더 좋은 방법이 있는지 살펴볼 예정이지만이 기능이 유용 할 수 있기를 바랍니다. 템플릿을 매개 변수화 할 수 있다면 좋을 것이므로 각 항목에 사용할 템플릿의 이름을 인수로 취하는 IEnumerable 템플릿을 작성할 수 있습니다.

+2

정확하게 똑같은 반응을 쓰고 있는데, 제가 추가 할 유일한 다른 것은'SelectListItem'을 다른 이름의 클래스로 싸서 다른 템플릿을 얻기 위해 사용할 수 있다는 것입니다. MVCContrib에 시작하려고 추가하려는 누군가를위한 좋은 장소. –

+1

설명과 조언을 주셔서 감사합니다. SelectListItem에서 상속하여 새 클래스를 만든 다음 해당 클래스에 대한 새 템플릿을 만들었습니다. 완벽하게 작동하지만 불필요한 오버 헤드처럼 보입니다. – Neilski

5

그냥 업데이 트가, 나는이 질문에 자신을 같은 문제를 해결하기 위해 비틀 거렸다.

내가하고 컬렉션의 각 인스턴스를 반복하고 개별적으로 EdtorFor를 호출하는, 일종의 같이했다 결국 무엇 : 아직도

<ul class="select-list-item cell-15 col-3 omega clearfix"> 
    @for (int i=0;i<Model.Categories.Count;i++) { 
     @Html.EditorFor(c => c.Categories[i], "CategoryIcons") 
    } 
</ul> 

깨끗하지,하지만 같은 새로운 클래스를 상속 때보 다 더 좋아을 너는 끝내 줬어. 당신이 EditorFor를 사용하는 경우

+0

Ben에게 감사합니다.이 솔루션이 훨씬 쉽다고 생각합니다. 특히 모델 인스턴스 하나만 처리하는 경우에 특히 그렇습니다. 나에게 맞는 것은 아니었고 특정 응용 프로그램에서 새 클래스를 만들면 실제로 데이터에 몇 가지 추가 메서드와 속성을 추가 할 수있었습니다. 물론 '말의 경우'라고 생각합니다. 귀하의 게시물에 대해 감사드립니다. 많은 감사를드립니다. – Neilski

1

(내 C# 구문이 조금 꺼져 있으면 미안 해요, vb.net에서 쓰기), 나는 루핑 솔루션이 작동합니다 생각하지 않습니다. IEnumerable 템플릿을 사용하면 폼 입력이 올바르게 명명 된 유일한 방법 인 것 같습니다. EditorFor를 반복해서 호출하는 경우 양식 <INPUT>은 색인 ID가 아닌 동일한 ID를 갖습니다.

나는이 문제를 경험하고 solution은 목록 항목을 통해 열거 템플릿과 하지 루프를 방출했다.

죄송합니다.이 답변을 작성하지 못하게 - 죄송합니다. 권리가 없습니다.