这不幸的是没有在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]
的上面适合你的两个选项希望之一。
的源代码链接:
谢谢,我在看ViewTypeParserFilter并看到了。我们最终设置了额外的虚拟目录,以便主页在编译时和设计时均可工作。 – Jeff 2010-02-04 17:26:33