Я согласен с Мехрдадом, насколько я знаю, что невозможно сделать общие взгляды. В одном из моих проектов я использовал интерфейс, очень похожий на ваш, а затем передал функции делегирования представлению, которое обрабатывает конкретную визуализацию каждого элемента.
Например, я бы использовал класс данных неуниверсального представления с дополнительным полем:
public interface ITrustGrid {
IPagedList Elements { get; set; }
IList<IColumn> Columns { get; set; }
IList<string> Headers { get; }
Func<object, string> ElementRenderer { get; }
}
В вашем основном виде вы подготовите данные вида:
<%
ITrustGrid data = (ITrustGrid)ViewData["employeeGrid"];
data.ElementRenderer = new Func<object, string>(delegate(o) {
var employee = (Employee)o;
//render employee
return html;
});
Html.RenderPartial("SimpleTrustGridViewer", data);
%>
Находясь в вашей части сетки, вы будете обрабатывать сетку как обычно, а затем вызывать делегат для визуализации каждой отдельной ячейки:
<%
foreach(var element in ViewData.Elements){
%>
<tr>
<td><%=ViewData.ElementRenderer(element) %></td>
</tr>
<%
}
%>
Конечно, приведенный выше код отображает только одну ячейку для каждого элемента, вам придется создать несколько более сложный делегат для отображения нескольких столбцов (или передать массив делегатов, по одному для каждого столбца).
Я думаю, что это был бы один из самых чистых способов сделать это, хотя и немного громоздким.