2014-03-31 33 views
6

我有一个asp.net webforms应用程序。每一个aspx.cs类都需要从继承自System.Web.UI.Page的BasePage.cs继承。如何抛出异常,当类继承错误

所需的页面继承:

class MyChildPage : BasePage : System.Web.UI.Page 

如何强制时创建一个新的子网页时,它从BasePage.cs继承,而不是System.Web.UI.Page的?

潜在的解决方案:

  • 有没有办法改变的aspx.cs页面默认创造?
  • 如果从System.Web.UI.Page继承,是否有抛出编译器错误的方法?

注意:这些子页面共享相同的母版页,以便可能有所帮助。

+0

您是否考虑过像[** FxCop **](http://msdn.microsoft.com/en-us/library/bb429476(v = vs.80).aspx)这样的工具?此外,你可以有一个自定义的构建步骤来验证每个页面扩展'BasePage'。 – mellamokb

回答

1

你可以用一个自定义的MSBuild任务来实现这一点,该任务验证所有页面。例如,这里是一个Task,它将检查只有BasePage继承自Page。如果任何其他类从Page继承,错误将在输出被记录,构建就会失败:

public class CheckBasePage : Task 
{ 
    public override bool Execute() 
    { 
     var assm = Assembly.LoadFile("/path/to/WebsiteAssembly.dll"); 
     var types = assm.GetTypes(); 

     var pages = new List<string>(); 
     foreach (var t in types) 
     { 
      if (t.BaseType == typeof(Page) && t.Name != "BasePage") 
      { 
       pages.Add(t.FullName); 
      } 
     } 

     if (pages.Count > 0) 
     { 
      Log.LogError("The following pages need to inherit from BasePage: [" + string.Join(",", pages) + "]"); 
      return false; 
     } 

     return true; 
    } 
} 

那么你会在你的项目文件中添加这个自定义任务作为构建过程的一部分:

<UsingTask TaskName="CheckBasePage" AssemblyFile="/path/to/MyCustomTasksAssembly.dll" /> 

<Target Name="PostBuild"> 
    <CheckBasePage /> 
</Target> 

现在假定MyCustomTasksAssembly是您创建的一个单独的项目,用于管理像这样的自定义MSBuild任务。如果您想将CheckBasePage任务嵌入到与代码其余部分相同的项目中,则需要应用same trick from here

+0

这会导致问题。装配完成后,它不会卸载装配。这会中断构建过程,因为程序集无法移动到bin目录,因为它由CheckBasePage任务使用。我试图创建加载在另一个应用程序域(http://msdn.microsoft.com/en-us/library/ms173101.aspx)程序集,所以我可以卸载它,但后来当我试图打开文件时,我没有发现文件异常。有任何想法吗? – Rafi

+0

是的,你读过最后一段吗?我自己测试了这个,并且能够正常工作。 – mellamokb

+0

是的,谢谢。我想在同一个大会上这样做。我发现问题是你无法将一个appDomain中的复杂对象传递给另一个(Type)。所以我改变了代码只传递常规对象,它的工作。 – Rafi

5

不知道是否符合你的情况,但你可以通过web.config-

为整个应用程序指定基页面上MSDN
<system.web> 
    <pages pageBaseType="BasePage" /> 
</system.web> 

文档:http://msdn.microsoft.com/en-us/library/950xf363(v=vs.85).aspx

+0

@ [Kelly Gendron]这实际上不起作用。这仅适用于没有代码的独立页面。查看答案中的文档,并在这里查看http://www.velocityreviews.com/forums/t602134-pagebasetype-attribute-in-pages-element.html了解更多详情。 – Rafi

0

作为替代凯利的回答,你能做到这一点,这是更灵活,但更痛苦的配置:

class MyChildPage : BasePage 

和...

class BasePage : System.Web.UI.Page 

所以MyChildPage继承自BasePage,其继承自System.Web.UI.Page

+0

这已经是我正在做的事情了。我的问题是,如何确保将来当我创建新页面时,即使我忘记了新开发人员加入团队,它仍然会保持这种状态。 – Rafi