Here is the complete solution:
Models
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MvcApplication1.Models { public abstract class BaseModel { public string Content { get; set; } } public class ConcreteModel1 : BaseModel { } public class ConcreteModel2 : BaseModel { } public class ConcreteModel3 : BaseModel { } }
composite view
@model System.Collections.Generic.List<MvcApplication1.Models.BaseModel> @{ ViewBag.Title = "CompositeView"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2> CompositeView</h2> @foreach (var model in Model) { Html.RenderPartial(string.Format("_{0}", model.GetType().Name), model); } , model.); @model System.Collections.Generic.List<MvcApplication1.Models.BaseModel> @{ ViewBag.Title = "CompositeView"; Layout = "~/Views/Shared/_Layout.cshtml"; } <h2> CompositeView</h2> @foreach (var model in Model) { Html.RenderPartial(string.Format("_{0}", model.GetType().Name), model); }
specific presentation
_ConcreteModel1.cshtml
@model MvcApplication1.Models.ConcreteModel1 <h1>Concrete Model 1</h1> @Model.Content
_ConcreteModel2.cshtml
@model MvcApplication1.Models.ConcreteModel2 <h1>Concrete Model 2</h1> @Model.Content
_ConcreteModel3.cshtml
@model MvcApplication1.Models.ConcreteModel3 <h1>Concrete Model 3</h1> @Model.Content
controller
public ActionResult CompositeView() { List<BaseModel> model = new List<BaseModel>(); model.Add(new ConcreteModel1() { Content = "This is model 1." }); model.Add(new ConcreteModel2() { Content = "This is model 2." }); model.Add(new ConcreteModel3() { Content = "This is model 3." }); return View(model); } <BaseModel> (); public ActionResult CompositeView() { List<BaseModel> model = new List<BaseModel>(); model.Add(new ConcreteModel1() { Content = "This is model 1." }); model.Add(new ConcreteModel2() { Content = "This is model 2." }); model.Add(new ConcreteModel3() { Content = "This is model 3." }); return View(model); } = "This is model 1."}); public ActionResult CompositeView() { List<BaseModel> model = new List<BaseModel>(); model.Add(new ConcreteModel1() { Content = "This is model 1." }); model.Add(new ConcreteModel2() { Content = "This is model 2." }); model.Add(new ConcreteModel3() { Content = "This is model 3." }); return View(model); } = "This is model 3."}); public ActionResult CompositeView() { List<BaseModel> model = new List<BaseModel>(); model.Add(new ConcreteModel1() { Content = "This is model 1." }); model.Add(new ConcreteModel2() { Content = "This is model 2." }); model.Add(new ConcreteModel3() { Content = "This is model 3." }); return View(model); }
source share