2010-01-28 85 views
1

我创建了自ViewPage得出与我希望能够在@ Page指令设置自定义属性的公共基类,但是我正在以下错误。添加自定义属性页面指令在asp.net-MVC

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

指令看起来如此

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

这个问题似乎是不承认的基类从继承标签。我认为这应该从互联网上阅读。有没有其他人试过这个或有任何想法,为什么这不起作用?

回答

4

这不幸的是没有在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] 

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

的源代码链接:

+0

谢谢,我在看ViewTypeParserFilter并看到了。我们最终设置了额外的虚拟目录,以便主页在编译时和设计时均可工作。 – Jeff 2010-02-04 17:26:33

0

你需要设置在web.config中的基本类型来解决这个问题。转到

/Views/Web.config

,改变

配置/ System.Web程序/页

和属性pageBaseType改变你的课。

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

我有两个不同的基页。一个是从ViewPage 派生的通用BaseViewPage ,另一个是派生自ViewPage的BaseViewPage。我想我可以改变BaseViewPage 从BaseViewPage派生。但后来我不得不复制泛型版本的ViewPage 中的代码。有一个更好的方法来解决这个问题,当你有一个通用的和非通用的基本视图页面? – Jeff 2010-01-28 23:16:37

+0

其实,我试过以上。它似乎没有工作。我不确定它与页面指令本身中的Inherits属性有什么不同。 – Jeff 2010-01-29 18:20:17

+0

@杰夫请看我的回复。这部分支持,但不支持泛型类型。 – Eilon 2010-02-02 03:05:38