添加自定义属性页面指令在asp.net-MVC
我创建了自ViewPage得出与我希望能够在@ Page指令设置自定义属性的公共基类,但是我正在以下错误。添加自定义属性页面指令在asp.net-MVC
错误24解析属性'attrame'时出错:类型'System.Web.Mvc.ViewPage'没有名为'attrname'的公共属性。
指令看起来如此
<%@ Page Title="" Language="C#" AttrName="Test" Inherits="Web.Helpers.Views.BaseViewPage" %>
这个问题似乎是不承认的基类从继承标签。我认为这应该从互联网上阅读。有没有其他人试过这个或有任何想法,为什么这不起作用?
这不幸的是没有在ASP.NET MVC 1.0或ASP.NET MVC支持2.
这样做的原因是在ASPX使用的一些MVC特定分析器逻辑的实现细节/ ASCX/MASTER文件。如果视图页面的(或视图的主网页的或视图的用户控制的)基本类型是一种一般类型有逻辑硬编码为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()语句,它将“inherits”属性重写为几个硬编码值之一。正如你将会看到的,只有当声明的基类型是通用的(因此我之前的评论),这个代码才会运行。
这取决于您自己决定如何更改此代码。关键在于类型名称必须是.NET的Type.GetType()方法可以理解的类型。也就是说,您必须将CLR语法用于泛型等结构,而不是C#或VB语法。例如,虽然在C#中,你可以说:
System.Web.Mvc.ViewPage<Customer>
在CLR的语法是这样的:
System.Web.Mvc.ViewPage`1[MyApp.Models.Customer]
的上面适合你的两个选项希望之一。
的源代码链接:
你需要设置在web.config中的基本类型来解决这个问题。转到
/Views/Web.config
,改变
配置/ System.Web程序/页
和属性pageBaseType
改变你的课。
<pages pageBaseType="Web.Helpers.Views.BaseViewPage" {your other attributes here} />
我有两个不同的基页。一个是从ViewPage
其实,我试过以上。它似乎没有工作。我不确定它与页面指令本身中的Inherits属性有什么不同。 – Jeff 2010-01-29 18:20:17
@杰夫请看我的回复。这部分支持,但不支持泛型类型。 – Eilon 2010-02-02 03:05:38
谢谢,我在看ViewTypeParserFilter并看到了。我们最终设置了额外的虚拟目录,以便主页在编译时和设计时均可工作。 – Jeff 2010-02-04 17:26:33