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

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

推荐答案

如果您希望视图具有强类型视图数据类,这可能适合您.其他解决方案可能超过correct个,但这是设计和实用性之间的良好平衡.

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

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

This is example code only and is not intended to compile as is. Designed for ASP.Net MVC 1.0.

Asp.net相关问答推荐

调用context.Users和context.Set User有什么区别?

web.config 部分的单独配置文件

任何人都有解决 Internet Explorer 上剩余 n 项问题的 idea 吗?

VS2013发布Web部署任务失败文件正在使用中

您对 Windows Workflow Foundation 有何体验?

Gridview ItemTemplate 中多个判断字段的最佳技术?

IIS 7.5 上没有 asp.net 功能

使用 Visual Studio 2012 恢复删除的文件

来自 IP 地址的经度和纬度值

如何使用 app_GlobalResource 或 app_LocalResource?

如何获取 ActionLink 的工具提示?

修改 web.config 时如何防止 ASP.NET 应用程序重新启动?

将查询参数绑定到 ASP.NET Core 中的模型

如何使用 WebRequest 发布数据并从网页获取响应

HttpResponse.End 或 HttpResponse.Close 与 HttpResponse.SuppressContent

ServiceStack 示例应该以什么顺序被理解?

Twitter Bootstrap 和 ASP.NET GridView

为什么在 MVC4 Razor 布局文件中无法识别 @Scripts 和 @Styles 命令?

Sys.WebForms.PageRequestManagerServerErrorException:处理服务器上的请求时发生未知错误.

如何使 URL 重写与 web.Release.config 转换一起工作?