2011-11-23 3 views
1

면도기 MVC를 처음 접했고보기에서 반환 한 값을 어떻게 읽을 수 있을지 궁금합니다.면도기 MVC보기에서 암시 적 반환 유형 읽기

내 코드는 다음과 같다 : 기본적으로

public ActionResult Subject(int Category) 
    { 
     var db = new KnowledgeDBEntities(); 
     var category = db.categories.Single(c => c.category_id == Category).name; 
     var items = from i in db.category_items 
        where i.category_id == Category 
        select new { ID = i.category_id, Name = i.name }; 
     var entries = from e in db.item_entry 
         where items.Any(item => item.ID == e.category_item_id) 
         select new { ID = e.category_item_id, e.title }; 
     db.Dispose(); 


     var model = new { Name = category, Items = items, Entries = entries }; 
     return View(model); 
    } 

, 나는 익명의 형식을 반환, 어떤 코드를 내보기에서 익명 형식의 값을 읽을 작성해야합니까?

그리고 이것이 가능하지 않은 경우 적절한 대안은 무엇입니까?

답변

2

는 기본적으로, 익명의 유형

아니에게 돌아갑니다. 일하지 않을거야. 익명 형식은 컴파일러에서 내부로으로 표시되고 ASP.NET은 런타임시 개별 어셈블리로보기를 컴파일하므로 정의 된 어셈블리에있는 익명 형식에 액세스 할 수 없습니다.

제대로 설계된 ASP.NET MVC 응용 프로그램에서는보기 모델을 사용하여 작업합니다. 그래서 당신은 몇 가지 정의하여 시작합니다

public class MyViewModel 
{ 
    public string CategoryName { get; set; } 
    public IEnumerable<ItemViewModel> Items { get; set; } 
    public IEnumerable<EntryViewModel> Entries { get; set; } 
} 

public class ItemViewModel 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

public class EntryViewModel 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
} 

을 다음 뷰에이보기 모델을 전달하는 컨트롤러 액션을 적응 :

public ActionResult Subject(int Category) 
{ 
    using (var db = new KnowledgeDBEntities()) 
    { 

     var category = db.categories.Single(c => c.category_id == Category).name; 
     var items = 
      from i in db.category_items 
      where i.category_id == Category 
      select new ItemViewModel 
      { 
       ID = i.category_id, 
       Name = i.name 
      }; 

     var entries = 
      from e in db.item_entry 
      where items.Any(item => item.ID == e.category_item_id) 
      select new EntryViewModel 
      { 
       ID = e.category_item_id, 
       Title = e.title 
      }; 

     var model = new MyViewModel 
     { 
      CategoryName = category, 
      Items = items.ToList(),  // be eager 
      Entries = entries.ToList() // be eager 
     }; 
     return View(model); 
    } 
} 

을 마지막으로 당신이 강하게 당신이 가지고있는 뷰 모델에보기를 입력 정의 :

@model MyViewModel 

@Model.Name 

<h2>Items:</h2> 
@foreach (var item in Model.Items) 
{ 
    <div>@item.Name</div> 
} 

<h2>Entries:</h2> 
@foreach (var entry in Model.Entries) 
{ 
    <div>@entry.Title</div> 
} 

을 도메인 모델과 난 당신이 AutoMapper을 확인하는 것이 좋습니다 뷰 모델 간의 매핑을 완화하는 방법으로.

@model MyViewModel 

@Model.Name 

<h2>Items:</h2> 
@Html.DisplayFor(x => x.Items) 

<h2>Entries:</h2> 
@Html.DisplayFor(x => x.Entries) 

을 한 다음과 같습니다

아, 그리고 뷰에서 foreach 루프를 쓰기 때문에 나는 기본적으로는 다음과 같이 볼 수 있도록 할 디스플레이/편집기 템플릿을 사용하여 당신을 추천 할 것입니다 재사용 좀 추한되지 않습니다

~/Views/Shared/DisplayTemplates/ItemViewModel :

@model ItemViewModel 
<div>@item.Name</div> 
자동 수집 각각의 각 요소에 대해 렌더링 될 각 표시 템플릿을 정의 0

~/Views/Shared/DisplayTemplates/EntryViewModel :

@model EntryViewModel 
<div>@item.Title</div> 
+0

그러나이 내가 한 번만 사용할 임시 수업을하고, 내가 나중에 다시 정의해야 할 수도 있습니다. 예를 들어, EntryViewModel은 데이터베이스에 더 많은 필드를 가지고 있지만, 그 순간에 두 필드 만 필요합니다. 다른 시간에 더 많이 필요할 수도 있습니다. 그런 다음 해당 클래스를 다시 정의해야합니까? – NomenNescio

+1

@NomenNescio에서 각 뷰에 대한 뷰 모델을 정의해야합니다. 익명의 클래스를 뷰에 전달할 수는 없습니다. 도메인 모델과보기 모델 간의 매핑을 단순화하기 위해 [AutoMapper] (http://automapper.org/)를 체크 아웃 할 수 있습니다. –

+0

어디서 볼 수 있습니까? 모델 디렉토리에서 오른쪽? 이름이 컨트롤러에 해당하는 디렉토리에 있습니까? – NomenNescio