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

时间:2010-01-28 20:55:34

标签: asp.net-mvc

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

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

该指令看起来如此

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

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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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

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

public class CustomerPage : MyBasePage<Customer> { }

public class ProductPage : MyBasePage<Product> { }

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

2)将ViewTypeParserFilter中的MVC源代码(请参阅下面的链接)复制到项目中并进行一些小的更改。要更改的关键方法是PreprocessDirective()方法。接下来是if()语句,它将“inherits”属性覆盖为少数硬编码值之一。正如您将看到的,只有当声明的基类型是通用的(因此我之前的注释)时,此代码才会运行。

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

System.Web.Mvc.ViewPage<Customer>

在CLR语法中,它类似于:

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

希望上面两个选项中的一个适合你。

源代码链接:

答案 1 :(得分:0)

您需要在web.config中设置基本类型以解决此问题。转到

  

/Views/Web.config

并更改

  

配置/ System.Web程序/网页

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

<pages pageBaseType="Web.Helpers.Views.BaseViewPage" {your other attributes here} />
相关问题