는 기본적으로, 익명의 유형
아니에게 돌아갑니다. 일하지 않을거야. 익명 형식은 컴파일러에서 내부로으로 표시되고 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>
그러나이 내가 한 번만 사용할 임시 수업을하고, 내가 나중에 다시 정의해야 할 수도 있습니다. 예를 들어, EntryViewModel은 데이터베이스에 더 많은 필드를 가지고 있지만, 그 순간에 두 필드 만 필요합니다. 다른 시간에 더 많이 필요할 수도 있습니다. 그런 다음 해당 클래스를 다시 정의해야합니까? – NomenNescio
@NomenNescio에서 각 뷰에 대한 뷰 모델을 정의해야합니다. 익명의 클래스를 뷰에 전달할 수는 없습니다. 도메인 모델과보기 모델 간의 매핑을 단순화하기 위해 [AutoMapper] (http://automapper.org/)를 체크 아웃 할 수 있습니다. –
어디서 볼 수 있습니까? 모델 디렉토리에서 오른쪽? 이름이 컨트롤러에 해당하는 디렉토리에 있습니까? – NomenNescio