代码之家  ›  专栏  ›  技术社区  ›  Jeff

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

  •  1
  • Jeff  · 技术社区  · 16 年前

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

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

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

    问题似乎是它无法从 标签。我想这应该可以通过在互联网上阅读来实现。有没有其他人尝试过这个,或者知道为什么它不起作用?

    2 回复  |  直到 16 年前
        1
  •  4
  •   Eilon    16 年前

    不幸的是,ASP.NET MVC 1.0或ASP.NET MVC 2不支持这一点。

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

    由于ASP.NET解析器查看MVC告知的基类,因此它只会是ViewPage,因此它无法识别您添加的新属性,并因此报告错误。

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

    1) 为所需的每种类型创建自定义页面基类型。此解决方案相当简单,但很麻烦:

    public class MyBasePage<TModel> : ViewPage<TModel> {
        ...
    }
    
    public class CustomerPage : MyBasePage<Customer> { }
    
    public class ProductPage : MyBasePage<Product> { }
    

    2) 从中复制MVC源代码(请参见下面的链接) ViewTypeParserFilter PreprocessDirective() 方法。底部是一个if()语句,它将“inherits”属性重写为几个硬编码值之一。如您所见,此代码仅在声明的基类型为泛型(因此我前面的注释)时运行。

    System.Web.Mvc.ViewPage<Customer>
    

    在CLR语法中,它类似于:

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

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

    源代码链接:

        2
  •  0
  •   Nick Berardi    16 年前

    /Views/Web.config

    并更改

    并更改属性 pageBaseType 为你们班干杯。

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