如果您希望视图具有强类型视图数据类,这可能适合您。其他解决方案可能更多correct但恕我直言,这是设计和实用性之间的一个很好的平衡。
母版页采用强类型视图数据类,仅包含与其相关的信息:
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 设计。