在不违反MVC规则的情况下将数据传递到母版页(使用ASP.NET MVC)的方法是什么?
就个人而言,我更喜欢编写抽象控制器(基控制器)或传递给所有视图的基类.
在不违反MVC规则的情况下将数据传递到母版页(使用ASP.NET MVC)的方法是什么?
就个人而言,我更喜欢编写抽象控制器(基控制器)或传递给所有视图的基类.
如果您希望视图具有强类型视图数据类,这可能适合您.其他解决方案可能超过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); %>
This is example code only and is not intended to compile as is. Designed for ASP.Net MVC 1.0.