当前位置:  开发笔记 > 编程语言 > 正文

将数据传递到ASP.NET MVC中的母版页

如何解决《将数据传递到ASP.NETMVC中的母版页》经验,为你挑选了4个好方法。

在不破坏MVC规则的情况下,将数据传递到母版页(使用ASP.NET MVC)的方式是什么?

就个人而言,我更喜欢编码传递给所有视图的抽象控制器(基本控制器)或基类.



1> Generic Erro..:

如果您希望视图具有强类型视图数据类,则这可能对您有用.其他解决方案可能更正确,但这是设计和实用性之间的良好平衡恕我直言.

母版页采用强类型视图数据类,其中仅包含与其相关的信息:

public class MasterViewData
{
    public ICollection Navigation { get; set; }
}

使用该母版页的每个视图都采用包含其信息的强类型视图数据类,并从母版页视图数据派生:

public class IndexViewData : MasterViewData
{
    public string Name { get; set; }
    public float Price { get; set; }
}

由于我不希望各个控制器知道有关将主页数据放在一起的任何信息,因此我将该逻辑封装到工厂中,该工厂传递给每个控制器:

public interface IViewDataFactory
{
    T Create()
        where T : MasterViewData, new()
}

public class ProductController : Controller
{
    public ProductController(IViewDataFactory viewDataFactory)
    ...

    public ActionResult Index()
    {
        var viewData = viewDataFactory.Create();

        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设计.


我喜欢使用强类型模型,但我不是将主数据与我所有其他模型和动作耦合的忠实粉丝.跳进这个线程有点晚了,但我发布了我的主数据方法,让事情更加松散.
这是Scott Gutherie推荐的方法,所以我必须同意.
http://weblogs.asp.net/scottgu/archive/2007/12/06/asp-net-mvc-framework-part-3-passing-viewdata-from-controllers-to-views.aspx#5415732

2> Todd Menier..:

我更喜欢将主视图的数据驱动部分分解为部分并使用Html.RenderAction渲染它们.与流行的视图模型继承方法相比,这有几个明显的优势:

    主视图数据与"常规"视图模型完全分离.这是继承的组合,导致更松散耦合的系统更容易改变.

    主视图模型由完全独立的控制器动作构建."常规"操作不需要担心这一点,并且不需要视图数据工厂,这对我的口味来说似乎过于复杂.

    如果您碰巧使用AutoMapper等工具将您的域映射到视图模型,您会发现它更容易配置,因为当您的视图模型不继承主视图数据时,它们将更接近您的域模型.

    使用主数据的单独操作方法,您可以轻松地将输出缓存应用于页面的某些区域.通常,主视图包含的变化频率低于主页面内容.


+1.另一个优点是,您可以根据当前运行时状态使用相同的视图使用不同的母版页.
在我看来,这是最优雅的解决方案.

3> Michael La V..:

编辑

Generic Error在下面提供了一个更好的答案.请仔细阅读!

原始答案

微软实际上已经在"官方"方式上发布了一个条目来处理这个问题.这提供了一步一步的演练,并解释了他们的推理.

简而言之,他们建议使用抽象控制器类,但请亲自看看.


我认为官方方式不是一个好方法

4> Ian P..:

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

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有