繁体   English   中英

ASP.NET主页是否应该从视图中获取其数据?

[英]Should an ASP.NET masterpage get its data from the view?

我一直在玩ASP.NET MVC,其中包含一个包含母版页的网站。

我创建了一个名为ProductThumbnailControl的MVC用户控件。 用户控件显示产品和小缩略图图像。 View是一个ViewProduct视图,它显示完整的产品信息 - usercontrol只是一个关闭网站的UI元素。

 public partial class ProductThumbnailControl :
                      System.Web.Mvc.ViewProductControl<ViewProductsModel>
 {

 }

我读了一篇博客文章 ,展示了用户控件如何使用ViewData 我了解到用户控件可以从父视图中自动获取其模型。 由于它使用相同的数据,因此View不需要向用户控件显式传递任何内容,从而使标记和代码更清晰。

所以现在我已经知道Master Page使用与页面相同的ViewData 这意味着Master Page本身并没有真正的模型来帮助自我渲染。

什么是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包含用户控件怎么办?

它会从哪里得到它的ViewData ,因为whle页面只有一个ViewData对象?

我是否必须使用我讨厌的这种可怕的语法并将主页的用户控件传递给显式模型?

Html.RenderUserControl("~/Views/Account/UserControls/Header.ascx",
  null, new { SelectedItem = "Profile" })

解决这种情况的最佳方法是什么?

我们的母版页从视图中获取数据。 我们对视图使用强类型视图名称 ,在该实现的方法中,我们还添加了每个页面需要来自持久对象的标准视图数据(例如应用程序菜单结构信息,用户信息显示在屏幕上等等)。

这样做的缺点是使得我们的母版页的视图数据不像模型对象那样强类型,但它对我们来说非常有效。

你的想法也很好。 由于Master页面的概念类似于继承的概念,为什么不使用继承来设置模型对象。 您可以更进一步,创建一个模型工厂,生成模型对象并设置基类数据。

看起来我的解决方案非常类似于微软的推荐,只有一个关键的例外。 我创建了一个ViewData基类,他们创建了一个Controller基类 - 这更有意义。

然而,似乎这两种想法都可以(并且应该)协同工作。 下面的MS教程使用字典来存储视图数据,因此如果你有一个强类型模型,你还需要一个基类。

Microsoft MVC教程

我将创建一个ShoppingCart控制器(或每个关注点的单独控制器),并使用Future DLL中的RenderAction渲染使用它们的用户控件,可以从www.codeplex.com/asp.net下载。 它是ASP.NET MVC源代码的一部分。

使用基本控制器或“站点模型”将太多事物耦合在一起,从而产生测试和维护噩梦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM