Если вы предпочитаете, чтобы ваши представления имели строго типизированные классы данных представления, это может сработать для вас. Другие решения, вероятно, более правильные , но это хороший баланс между дизайном и практичностью ИМХО.
Главная страница принимает класс данных со строго типизированным представлением, содержащий только информацию, относящуюся к ней:
public class MasterViewData
{
public ICollection<string> Navigation { get; set; }
}
Каждое представление, использующее эту главную страницу, использует строго типизированный класс данных представления, содержащий его информацию и производный от данных представления главных страниц:
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
}
Поскольку я не хочу, чтобы отдельные контроллеры знали что-либо о сборке данных главных страниц, я инкапсулирую эту логику в фабрику, которая передается каждому контроллеру:
public interface IViewDataFactory
{
T Create<T>()
where T : MasterViewData, new()
}
public class ProductController : Controller
{
public ProductController(IViewDataFactory viewDataFactory)
...
public ActionResult Index()
{
var viewData = viewDataFactory.Create<ProductViewData>();
viewData.Name = "My product";
viewData.Price = 9.95;
return View("Index", viewData);
}
}
Наследование соответствует мастеру для хорошего просмотра отношений, но когда дело доходит до рендеринга частичных / пользовательских элементов управления, я объединю их данные представления в данные просмотра страниц, например,
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
public SubViewData SubViewData { get; set; }
}
<% Html.RenderPartial("Sub", Model.SubViewData); %>
Это только пример кода и не предназначен для компиляции как есть. Разработано для ASP.Net MVC 1.0.