你在ASP.NET MVC中传递数据给母版页的方式是什么,同时又不违反MVC规则?
个人而言,我更喜欢编写抽象控制器(基础控制器)或基类,并将其传递到所有视图中。
你在ASP.NET MVC中传递数据给母版页的方式是什么,同时又不违反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。
where T : MasterViewData, new()
告诉编译器Create方法只能被调用扩展了MasterViewData
类型(在本例中是IndexViewData
)并且使用默认或无参数构造函数的类型。换句话说,我需要能够说MasterViewData data = new T();
。 - StriplingWarriorNavigation
属性是在哪里/何时被赋值的吗? - IsmailS我更喜欢将主视图中的数据驱动部分拆分成部分视图,并使用Html.RenderAction进行渲染。这比流行的视图模型继承方法具有以下几个明显优势:
编辑
Generic Error 提供了一篇更好的答案,请阅读它!
原始回答
微软实际上在"官方"方式上发布了一篇文章来处理这个问题。他们提供了一个逐步介绍并解释其理由的步骤。
简而言之,他们建议使用一个抽象控制器类,但你可以自己看看。
抽象控制器是个好主意,我还没有找到更好的方法。我很想看看别人都做了些什么。
<script runat="server" type="text/C#">
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
MasterModel = SiteMasterViewData.Get(this.Context);
}
protected SiteMasterViewData MasterModel;
</script>
很明显,我在SiteMasterViewData上有一个静态方法Get(),它返回SiteMasterViewData。
Request.Params对象是可变的。在请求处理周期中,将标量值添加到其中非常容易。从视图的角度来看,这些信息可以在QueryString或FORM POST中提供。希望这有所帮助。
我认为另一种好的方式是创建一个视图接口,其中包含某些属性,例如某个接口的父视图,这样您就可以同时用于需要引用页面(父控件)的控件和应从视图访问的主视图。