2008-09-17 76 views
97

什么是你的方式传递数据到主页(使用ASP.NET MVC)没有打破MVC规则?个人而言,我更喜欢编码抽象控制器(基本控制器)或传递给所有视图的基类。传递数据到主页在ASP.NET MVC

+1

我写了一篇关于如何管理的指南:http://www.britishdeveloper.co.uk/2010/06/mvc-pass-viewmasterpage-model.html应该有帮助 – BritishDeveloper 2011-06-21 20:38:20

回答

75

如果你喜欢你的视图有强类型的视图数据类,这可能适合你。其他解决方案可能更多正确但这是一个很好的设计和实用性之间的平衡恕我直言。

母版页需要包含相关的唯一信息的强类型的视图数据类吧:

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); 
    } 
} 

继承匹配主要视图关系,但是当涉及渲染partials /用户控件时,我会将其视图数据组合到页面视图数据中。

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而设计。

+4

这是Scott推荐的方法Gutherie,所以我不得不同意。 – 2009-09-21 21:34:18

+0

@Simon Fox - 有一个链接到scottgu的推荐?找不到它。 – orip 2009-12-15 14:10:33

+4

http://weblogs.asp.net/scottgu/archive/2007/12/06/asp-net-mvc-framework-part-3-passing-viewdata-from-controllers-to-views.aspx#5415732 – 2010-03-18 12:05:23

6

抽象控制器是一个好主意,我还没有找到更好的方法。我很想看看其他人也做了什么。

0

Request.Params对象是可变的。作为请求处理周期的一部分,为它添加标量值非常简单。从视角来看,这些信息可能已经在QueryString或FORM POST中提供。 hth

0

我东西,另一种好办法是可以为查看一些属性像一些接口的ParentView创建界面,让您可以使用它无论对于其需要的参考控制页面(父控件)以及应该从视图访问的主视图。

2

我发现你传递给视图的所有模型对象的共同父对象非常有用。

无论如何,页面之间始终会存在一些常见的模型属性。

20

编辑

Generic Error已经下面提供一个更好的答案。请阅读它!

原来的答案

微软实际上已经张贴在the "official" way一个条目来处理这个问题。这提供了一个循序渐进的解释他们的推理。

总之,他们推荐使用抽象控制器类,但请亲自看看。

0

其他解决方案缺乏优雅,花费时间太长。所以很明显

<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:我几乎整整一年后这样做很伤心,贫困的事情道歉。

59

我更喜欢将主视图的数据驱动片断分解成部分并使用Html.RenderAction。这个拥有广受欢迎的视图模型继承方法几个明显的优势:

  1. 母版视图的数据是完全从“普通”视图模型脱钩。这是继承的组合,并导致更容易更改的更松散耦合的系统。
  2. 主视图模型由完全独立的控制器动作构建。 “常规”操作不需要担心这一点,也不需要一个视图数据工厂,这对我的口味来说看起来过于复杂。
  3. 如果您碰巧使用像AutoMapper这样的工具将您的域映射到您的视图模型,您会发现配置起来更容易,因为当它们不继承主视图数据时,视图模型将更接近您的域模型。
  4. 使用独立的主数据操作方法,您可以轻松地将输出缓存应用于页面的某些区域。通常情况下,主视图包含的数据更改频率比主页面内容更少。