在不违反MVC规则的情况下,如何将数据传递到母版页(使用ASP.NET MVC)?
就个人而言,我更喜欢对传递给所有视图的抽象控制器(基本控制器)或基类进行编码。
如果您希望视图具有强类型的视图数据类,则这可能对您有用。其他解决方案可能更 正确, 但这是设计和实用性恕我直言之间的良好平衡。
母版页采用强类型的视图数据类,该类仅包含与之相关的信息:
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设计。