将自定义属性添加到 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以上是关于将自定义属性添加到 asp.net-mvc 中的页面指令的主要内容,如果未能解决你的问题,请参考以下文章
如何将消息从我的存储库类返回到我的控制器,然后返回到我在 asp.net-mvc 中的视图?
如何将自定义彩色图像添加到 TabBarController 中的 tabBar?
将自定义数据属性添加到 Vuetify v-select 选项