我一直在使用包含母版页的ASP.NET MVC。
我创建了一个名为ProductThumbnailControl
的MVC用户控件。用户控件显示产品和小缩略图图像。 View是一个ViewProduct
视图,显示完整的产品信息 - usercontrol只是一个关闭网站的UI元素。
public partial class ProductThumbnailControl :
System.Web.Mvc.ViewProductControl<ViewProductsModel>
{
}
I read a blog entry显示用户控件如何使用ViewData
。我了解到用户控件可以自动从父视图中获取其模型。由于它使用相同的数据,因此View不需要向用户控件明确传递任何内容,从而使标记和代码更清晰。
所以现在我已经了解到母版页使用与页面相同的ViewData
。这意味着Master Page本身并没有真正的模型来帮助自我渲染。
主页首先获取数据的正确方法是什么?
我考虑过尝试以下方法?
您可以拥有SiteModel
:
//Arbitrary properties for example
class SiteModel
{
public string PartnerId {get; set;}
public ShoppingCart ShoppingCartContents {get; set;}
public string CurrentUserId {get; set;}
}
View继承自它:
class ViewProductModel : SiteModel
{
public Product Product {get; set;}
}
母版将使用 SiteModel
。如果需要,视图可以使用来自它的数据 - 如果他们需要在某处显示当前用户的电子邮件。
这是一个可怕的想法吗?
母版页是否应该从需要的地方获取数据?
如果我想在masthead
?
由于whle页面只有一个ViewData
对象,它会从哪里得到ViewData
?
我是否必须使用我讨厌的这种可怕的语法并将母版页的用户控件传递给显式模型?
Html.RenderUserControl("~/Views/Account/UserControls/Header.ascx",
null, new { SelectedItem = "Profile" })
解决这种情况的最佳方法是什么?
答案 0 :(得分:3)
我们的母版页从视图中获取数据。我们使用strongly typed view names作为我们的视图,在该实现的方法中,我们还添加了每个页面需要来自持久对象的标准视图数据(例如应用程序菜单结构信息,用户信息显示在屏幕上等等)
这样做的缺点是使得母版页的视图数据不像模型对象那样强类型,但它对我们来说效果很好。
你的想法也很好。由于Master页面的概念类似于继承的概念,为什么不使用继承来设置模型对象。您可以更进一步,创建一个模型工厂,生成模型对象并设置基类数据。
答案 1 :(得分:2)
看起来我的解决方案非常类似于Microsoft的推荐,只有一个关键例外。我创建了一个ViewData基类,他们创建了一个Controller基类 - 这更有意义。
然而,似乎这两种想法都可以(并且应该)协同工作。下面的MS教程使用字典来存储视图数据,因此如果您有一个强类型模型,那么您还需要一个基类。
答案 2 :(得分:0)
我会创建一个ShoppingCart控制器(或每个关注点的单独控制器),并使用Futures DLL中的RenderAction渲染使用它们的用户控件,您可以从www.codeplex.com/asp.net下载。它是ASP.NET MVC源代码的一部分。
使用基本控制器或“站点模型”将太多东西结合在一起,造成测试和维护噩梦。