WebForms 3.5中强类型的ASCX?

时间:2009-07-07 11:45:39

标签: asp.net generics user-controls webforms strong-typing

我希望摆脱WebForms 3.5应用程序中控件的代码隐藏。再次被MVC中的错误所困扰,我想通过以下方式更接近这种方法:

<%@ Control Language="C#" Inherits="Core.DataTemplate<Models.NewsArticle>" %>

这给了我你期望的解析器错误,所以我记得当这是一个等待MVC预览中的修复的问题,并将其更改为:

<%@ Control Language="C#" Inherits="Core.DataTemplate`1[[Models.NewsArticle]]" %>

但这也不起作用! MVC团队如何利用这种能力?关于MVC项目类型而不是最新的VS2008 Service Pack是否特别?

没有放弃并要求将来的模板有代码隐藏文件,我最好的选择是尽可能接近通用用户控制方法吗?

2 个答案:

答案 0 :(得分:4)

好吧,看起来我已经设法做到了。在查看MVC团队为ViewUserControl<T>实现的PageParserFilter之后,我能够为自己的DataTemplate<T>目的构建类似的东西。甜。我现在可以使用这行:

<%@ Control Language="C#" Inherits="Core.DataTemplate<Models.NewsArticle>" %>

并且,没有任何代码隐藏文件,它解析!如果我发现在这个过程中我发现了其他的东西,我会报告回来!

答案 1 :(得分:0)

使用WebForms,你几乎失去了使它们在没有代码隐藏页面的情况下变得有用的一切,因为VS无法自动生成包含所有runat="server"控件的实际定义的设计器文件。

你可以做的是拥有一个共同的基页类,并使其成为通用:

public class DataTemplate<T> : Page {
    public T Model {get;set;}
}

public partial class MyCodeBehindClass : 
    DataTemplate<Models.NewsArticle> {
    ...
}

这将允许WebForms所做的所有拖放组件工作不受阻碍地工作,同时还允许您访问页面上的强类型模型:

<%@ Control Language="C#" Inherits="MyCodeBehindClass" %>

<% foreach( var item in Model ) { %>
    <!-- do stuff -->
<% } %>