2012-05-16 4 views
3

mvc 템플릿과 제네릭에 관한 몇 가지 질문이 있지만 찾고있는 것과 관련이없는 것 같습니다. 다음과 같은 모델을 고려MVC3 면도기 편집기/표시 템플릿 및 제네릭

namespace MyNamespace 
{ 
    public class ModelBase { /* Not important for example */ } 

    public class MyModel : ModelBase 
    { 
     public string Name { get; set; } 
    } 

    public class MyViewModel 
    { 
     public IEnumerable<ModelBase> Data { get; set; } 
    } 
} 

그리고 컨트롤러 :이 특별

@model MyNamespace.MyViewModel 
@Html.EditorFor(m => m.Data) 

아무것도 :

public class HomeController : Controller 
{ 
    public ActionResult Index 
    { 
     return View(new MyViewModel { Data = new List<MyModel>() }) 
    } 
} 

면도칼은 뷰를 볼 수/홈/Index.cshtml과 같을 것이다. 내가 뷰/공유/EditorTemplate 아래 또는 뷰/홈/EditorTemplates에서 MyModel.cshtml이라는 파일을 만들 수있는 디스플레이 또는 편집기 템플릿을 원한다면 올바르게 찾습니다.

목록을 표시 할 때 ModelBase의 각 구현에 대해 다른 작업을 수행하려면 어떻게해야합니까? Mvc 뷰 파인더는 위의 경로 중 하나에서 List'1.cshtml 템플릿을 올바르게 찾습니다. 그러나 내가해야 할 일은 List`1 [MyModel] .cshtml의 템플릿을 작성하는 것입니다.

올바른 파일 이름을 얻지 못하는 것 같습니다. 내가이 (이름이 예를 기준으로) 지금까지 시도했습니다.

  • List`1 [MyModel] .cshtml
  • List`1 [[MyModel]
  • List`1을 cshtml [MyNamespace에 .MyModel] .cshtml
  • List`1 [[MyNamespace.MyModel]. cshtml 나는 사용자 정의 뷰 파인더를 작성 않도록하려면 가능하면

. 물건을 넘을 수 없다면 지금 생각할 수있는 유일한 대안은 List`1.cshtml을 List에서 추론 된 이름으로 부분 호출을하는 것입니다.

+0

템플릿 List'.cshtml이 Views \ Home 내의 모든 목록을 처리하는 곳에서 빠르고 더러운 솔루션을 만들었습니다. 템플릿 이름을 일반 및 포함 된 형식에서 수동으로 컴파일하고 부분으로 호출하여 모델을 전달합니다. 자랑스럽지 않지만 내가 생각할 수있는 유일한 해결책. "올바른 길"을 환영한다는 제안. 그래서 나는 List' [MyModel] .cshtml과 비슷한 템플릿을 만들었습니다. –

답변

1

이 코드를 확인하지 않은하지만 내가 좋아하는 바보 같은 일 각 하위 유형에 대해 서로 다른 뷰를 생성 할 것입니다 : 그래서보기 당신의 유형의 이름과 일치하는지

return View(MyModel.GetType().Name, new MyViewModel { Data = new List<MyModel>() }) 

합니다. 당신은 기본보기에서이 작업을 수행 할 수

+0

그래, 그 이유는 내가 Html.EditorFor 또는 Html.DisplayFor가 다른 템플릿에서 호출되기 때문에 템플릿 내부에서 끝났기 때문이다. –

0

: 다음

@model MyViewModel 
@Html.EditorFor(x => x.Data) 

하고 있습니다

  • ~/Views/Shared/EditorTemplates/MyModel.cshtml :

    @model MyModel 
    ... 
    
  • ~/Views/Shared/EditorTemplates/MyOtherModel.cshtml (여기서 분명히 MyOtherModelModelBase에서 유래) :

    @model MyOtherModel 
    ... 
    

등등은 ... ASP.NET MVC는이 컬렉션의 각 요소의 실행시의 형태에 따라 올바른 템플릿을 데이터 속성을 통해 반복 돌봐하고 선택할 것입니다.

+0

그건 정확히 내 문제 다. 나는 Mvc가 아이템을 반복하지 않기를 바란다. List 모델로 보내진 ModelBase의 각 구현에 대한 템플릿을 갖고 List , List 에 대해 다른 모델을 만들고 싶습니다. –

6

아주 늦게 반응, 유용한 경우 바로이 같은 질문에 다른 사람 범프

는 당신의 이름을 정의 할 UIHintAttribute을 사용할 수 있습니다 (나는 몇 분 전에이 작업을 수행하는 방법을 기억하려고했던 것처럼) 편집자

public class MyViewModel 
{ 
    [UIHint("MyModel")] 
    public IEnumerable<ModelBase> Data { get; set; } 
}