Ваши модели извлекают данные, ваш докладчик организует данные для представления, а элементы управления представлением связывают вашу модель с элементами пользовательского интерфейса. Например, вот модель для LogEvent:
public class LogEvent{
public string Title {get;set;}
public string Date {get;set;}
public string Message {get;set;}
// this is for example only; you would most likely bind directly against the host.GetAllLogs() result
public static IEnumerable<LogEvent> RetrieveAllLogs(ILogProvider host){
return from x in host.GetAllLogs() select new LogEvent(x.LogTitle, x.Date, x.Message);
}
Вот контроллер, который обрабатывает запрос пользователя на просмотр всех журналов:
[DependencyPropertyLolJk]
protected ILogProvider MyLogProvider {get;set;} // set by DI
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Logs()
{
return View("Logs", LogEvent.GetAllLogs(MyLogProvider).OrderByDescending(x => x.Date));
}
А вот вид и как он привязан к модели:
<!-- header left out for brevity -->
<table>
<thead>
<tr>
<th>
Date
</th>
<th>
Title
</th>
<th>
Message
</th>
</tr>
</thead>
<% foreach(var log in ViewData.Model) %>
<tr>
<td><%= log.Date %></td>
<td><%= log.Title %></td>
<td><%= log.Message %></td>
</tr>
<% }; %>
</table>
<!-- ... -->
Итак, вы видите, вы должны написать свой HTML, используя встроенный код. Это хорошо работает для простых пользовательских интерфейсов, но может быть сложным и трудоемким, когда речь идет о более сложных вещах, таких как пейджеры и сетки.
Когда ваш пользовательский интерфейс становится сложным, проще всего создать расширения для класса HtmlHelper. Вот два примера, которые показывают, как это может сократить сложность вашего пользовательского интерфейса: элементы управления HtmlHelper GridView и Pager . Я создал аналогичные вспомогательные методы, и довольно удивительно, как вы можете смешивать html и встроенный код в лямбдах. Теперь, если дизайнер смог прилично отформатировать этот смешанный код / разметку ...