Wenn Sie möchten, dass Ihre Ansichten stark typisierte Ansichtsdatenklassen haben, funktioniert dies möglicherweise für Sie. Andere Lösungen sind wahrscheinlich korrekter, aber dies ist meiner Meinung nach eine gute Balance zwischen Design und Praktikabilität.
Die Masterseite verwendet eine stark typisierte Ansichtsdatenklasse, die nur relevante Informationen enthält:
public class MasterViewData
{
public ICollection<string> Navigation { get; set; }
}
Jede Ansicht, die diese Masterseite verwendet, verwendet eine stark typisierte Ansichtsdatenklasse, die ihre Informationen enthält und aus den Ansichtsdaten der Masterseiten abgeleitet wird:
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
}
Da ich nicht möchte, dass einzelne Controller etwas über das Zusammenstellen der Masterseitendaten wissen, kapsle ich diese Logik in eine Factory, die an jeden Controller übergeben wird:
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);
}
}
Die Vererbung passt gut zum Master, um die Beziehung anzuzeigen, aber wenn es um das Rendern von Partials / Benutzersteuerelementen geht, werde ich deren Ansichtsdaten in die Seitenansichtsdaten zusammensetzen, z
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
public SubViewData SubViewData { get; set; }
}
<% Html.RenderPartial("Sub", Model.SubViewData); %>
Dies ist nur Beispielcode und soll nicht so kompiliert werden, wie er ist. Entwickelt für ASP.Net MVC 1.0.