将自定义属性添加到 asp.net-mvc 中的页面指令

Posted

技术标签:

【中文标题】将自定义属性添加到 asp.net-mvc 中的页面指令【英文标题】:Adding Custom attributes to the page directive in asp.net-mvc 【发布时间】:2010-01-28 20:55:34 【问题描述】:

我创建了一个派生自 ViewPage 的基类,它具有我希望能够在 @page 指令中设置的自定义公共属性,但是我收到以下错误。

错误 24 解析属性“attrame”时出错:类型“System.Web.Mvc.ViewPage”没有名为“attrname”的公共属性。

指令看起来是这样的

<%@ Page Title="" Language="C#" AttrName="Test" Inherits="Web.Helpers.Views.BaseViewPage" %>

问题似乎是它无法识别 Inherits 标记中的基类。我认为这应该通过在互联网上阅读来实现。有没有其他人尝试过这个或知道为什么这不起作用?

【问题讨论】:

【参考方案1】:

很遗憾,ASP.NET MVC 1.0 或 ASP.NET MVC 2 不支持此功能。

原因是在 ASPX/ASCX/MASTER 文件中使用的一些特定于 MVC 的解析器逻辑的实现细节。如果视图页面(或视图母版页或视图用户控件)的基类型是泛型类型,则存在将 ASP.NET 解析器的基类硬编码为常规 ViewPage(或 ViewMasterPage 或 ViewUserControl)的逻辑。

因为 ASP.NET 解析器查看 MVC 告诉的基类,所以它永远只会是 ViewPage,因此它无法识别您添加的新属性,因此会报告错误。

值得一提的是,这仅适用于您在视图页面中指定的基类是通用的。如果您使用非泛型类型,那么它应该可以正常工作,并且您应该能够在自定义属性上设置值。

我可以想到两种解决方法:

1) 为您需要的每种类型创建自定义页面基本类型。这个解决方案相当简单,虽然很麻烦:

public class MyBasePage<TModel> : ViewPage<TModel> 
    ...


public class CustomerPage : MyBasePage<Customer>  

public class ProductPage : MyBasePage<Product>  

然后在视图页面的“继承”属性中只使用非泛型派生类型。

2) 将 ViewTypeParserFilter 中的 MVC 源代码(参见下面的链接)复制到您的项目中并进行一些小的更改。更改的关键方法是PreprocessDirective() 方法。靠近底部的是一个 if() 语句,它将“继承”属性覆盖为几个硬编码值之一。正如您将看到的,此代码仅在声明的基类型是泛型时运行(因此我之前的评论)。

具体如何更改此代码由您决定。这里的关键是类型名称必须是 .NET 的 Type.GetType() 方法可以理解的类型。也就是说,对于泛型等构造,您必须使用 CLR 语法,而不是 C# 或 VB 语法。例如,在 C# 中,您可以说:

System.Web.Mvc.ViewPage<Customer>

在 CLR 语法中是这样的:

System.Web.Mvc.ViewPage`1[MyApp.Models.Customer]

希望以上两个选项之一适合您。

源码链接:

ASP.NET MVC 1.0 source code download ASP.NET MVC 2 RC source code

【讨论】:

谢谢,我在查看 ViewTypeParserFilter 并看到了。我们最终只是设置了额外的虚拟目录,以便母版页在编译时和设计时都可以工作。【参考方案2】:

您需要在 web.config 中设置基本类型来解决这个问题。去

/Views/Web.config

并改变

配置/system.web/pages

并将属性pageBaseType 更改为您的班级。

<pages pageBaseType="Web.Helpers.Views.BaseViewPage" your other attributes here />

【讨论】:

我有两个不同的基本页面。一个是从 ViewPage 派生的通用 BaseViewPage,另一个是从 ViewPage 派生的 BaseViewPage。我想我可以将 BaseViewPage 更改为从 BaseViewPage 派生。但随后我将不得不在 ViewPage 的通用版本中复制代码。当您拥有通用和非通用基本视图页面时,是否有更好的方法来解决此问题? 其实上面的方法我都试过了。它似乎不起作用。我不确定这与 page 指令本身的 Inherits 属性有何不同。 @Jeff 请看我的回复。部分支持,但不支持泛型。

以上是关于将自定义属性添加到 asp.net-mvc 中的页面指令的主要内容,如果未能解决你的问题,请参考以下文章

如何将消息从我的存储库类返回到我的控制器,然后返回到我在 asp.net-mvc 中的视图?

如何将自定义彩色图像添加到 TabBarController 中的 tabBar?

将自定义数据属性添加到 Vuetify v-select 选项

如何将自定义属性添加到 Symfony Doctrine YAML 映射文件

将自定义样式属性添加到 MXML 自定义组件

在 ASP.Net-MVC 中的控制器之间传递信息