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

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

===============>>#1 票数:77 已采纳

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

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

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

这只是示例代码,不打算按原样编译。 专为ASP.Net MVC 1.0设计。

===============>>#2 票数:59

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

  1. 主视图数据与“常规”视图模型完全分离。 这是继承的组合,导致更松散耦合的系统更容易改变。
  2. 主视图模型由完全独立的控制器动作构建。 “常规”操作不需要担心这一点,并且不需要视图数据工厂,这似乎对我的口味过于复杂。
  3. 如果您碰巧使用AutoMapper等工具将您的域映射到视图模型,您会发现它更容易配置,因为当您的视图模型不继承主视图数据时,它们将更接近您的域模型。
  4. 使用主数据的单独操作方法,您可以轻松地将输出缓存应用于页面的某些区域。 通常,主视图包含的变化频率低于主页面内容。

===============>>#3 票数:20

编辑

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

原始答案

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

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

===============>>#4 票数:7

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

===============>>#5 票数:3

我做了一些研究,发现了这两个网站。 也许他们可以帮忙。

ASP.NET MVC技巧#31 - 将数据传递到母版页和用户控件

使用ASP.NET MVC将数据传递到母版页

===============>>#6 票数:2

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

无论如何,页面之间总会有一些常见的模型属性。

===============>>#7 票数: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上有这个返回SiteMasterViewData的静态方法Get()。

===============>>#8 票数:0

Request.Params对象是可变的。 作为请求处理周期的一部分,将标量值添加到它中非常容易。 从视图的角度来看,可以在QueryString或FORM POST中提供该信息。 心连心

===============>>#9 票数:0

我还有另外一个好方法可以创建一个视图接口,使用某些属性,如某些接口的ParentView,这样你就可以将它用于需要引用页面的控件(父控件)和应该从中访问的主视图观点。

  ask by Łukasz Sowa translate from so

未解决问题?本站智能推荐:

4回复

在ASP.NET MVC中更改视图的布局(母版页)而不重新创建它

我正在使用带有Razor视图的ASP.NET MVC 3。 如果要创建视图,可以为视图选择布局(母版页),或者选择“默认”(_Layout)。 我很有兴趣在创建视图后更改此布局而不重新创建它,是否有任何地方存储有关视图的布局信息? 我该怎么改变它?
1回复

ASP.NET MVC在母版页上创建动态导航子菜单

我正在尝试创建一个ASP.NET MVC主页,因此其上的网站导航如下所示: 主菜单: Home | About | News Home | About | News 子菜单: Home_Page1 | Home_Page2 Home_Page1 | Home_Page2 除非用户
2回复

在asp.net mvc5中将值传递给路由

我的第一个控制器: 我的第二个控制器代码是: 我想将密钥从第一个控制器传递给我面临错误的第二个控制器: 找不到视图“ 42201-09007860-1”或其主视图,或者没有视图引擎支持搜索到的位置。 搜索了以下位置:〜/ Views / Experience / 42
1回复

跨页发布asp.net与asp.net mvc

我对asp.net中的跨页面发布有疑问。 1.)为什么要求在目标页面中使用PreviousPage类/ API而不使用Request.Form集合? 我的意思是,为什么我们不能使用Request.Form集合将上一页的值读入目标页。 2)为什么在asp.net mvc中不存在这种跨
3回复

常规ASP.NET 4.0 aspx页(不是MVC)中的代码块

是否可以在常规ASP.NET中执行以下操作(或类似操作): 我需要做一个网格,但是我想控制html表的输出方式。
11回复

在ASP.NET MVC的母版页中使用脚本

我对ASP.NET MVC相当陌生,并且在脚本方面遇到了一些麻烦……特别是,我想在大多数页面中使用jQuery,因此将其放在母版页中是有意义的。 但是,如果我这样做(从我的~/Views/Shared/Site.Master ): 然后,这实际上就是客户的问题-当然,只有在我们当前的路
3回复

asp.net mvc 4 simplemembership与外部数据库

我正在使用内置的asp.net mvc 4 WebSecurity简单成员身份。 我已经从app_data文件夹aspnet.mdf文件到在SpeedHost服务器上托管的外部数据库手动生成了创建表脚本,并获得了下面的连接字符串,当我从计算机上开发应用程序时,它运行良好。 但是,当我在
3回复

在ASP.NET MVC中处理会话超时

我正在MVC应用程序上工作,并且我需要根据查询字符串中的几个参数将用户重定向到不同的错误页面,以处理错误和会话超时。 我面临的问题是,我试图通过将所需的参数从querystring保存到会话中,然后重定向到错误页面来实现此目的。 但是在我的控制器中执行每个HttpGet和Post操作之前
2回复

如何在ASP.NET MVC中模拟AuthorizeAttribute?

我有自己的自定义Authorize Attribute,我正在尝试检查控制器方法以查看它们是否具有正确的角色。 现在,我的自定义授权标签中包含数据库代码。 我模拟的方法似乎不起作用,因为我发现的反射内容似乎没有传递任何参数,因此我在Authorize Attribute中的默认构造函数受
2回复

这个项目在ASP.NET MVC中可行吗?

我是Stack Overflow和ASP.NET MVC的新手。 我被要求做一个我想使用ASP.NET MVC的项目,但是我在解决这个问题时遇到了一些问题,希望你们中的一些人能使我朝正确的方向发展。 该项目是一种搜索门户。 在每个页面上都有一个下拉框,您可以从中基本上选择要搜索的数