2009-07-07 3 views
2

Я ищу, чтобы избавиться от кода для элемента управления в приложении WebForms 3.5. Опять же укушен ошибка, как это сделано в MVC, я хотел бы получить на шаг ближе к этой методике, выполнив:Сильно типизированный ASCX в WebForms 3.5?

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

Это дает мне ошибку синтаксического анализа можно было бы ожидать, так что я вспомнил обратно когда это было проблемой в ожидании исправления в MVC Preview, и изменил его:

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

Но это не сработало! Как получилось, что команда MVC смогла использовать эту способность? Было ли это чем-то особенным по типу проекта MVC, а не последним пакетом обновления VS2008?

Зачем отказываться от необходимости и требовать от будущих шаблонов иметь файлы с кодом, каковы мои лучшие варианты, чтобы максимально приблизить его к универсальному методу управления пользователями?

+0

Похоже, вы пытаетесь согнуть веб-формы. Лично, когда я делаю веб-формы, я делаю то, что делает веб-формы, то есть с кодом за файлами. Выполняя ASP.NET MVC, я делаю что-то в стиле MVC. Попытка сгибать одно в другом, просит неприятностей. – RichardOD

+0

В каком-то смысле я пытаюсь сгибать WebForms, но если можно избавиться от ненужных файлов, я не думаю, что это слишком много, чтобы спросить. Особенно, когда уже есть синтаксис, который, как я видел, работает в очень близком контексте, который был бы идеально подходящим, просто разочаровывает его отсутствие. – tags2k

ответ

4

Ну, похоже, мне удалось это сделать. Посмотрев на страницу PageParserFilter, реализованную командой MVC для ViewUserControl<T>, я смог построить что-то подобное для моих собственных целей DataTemplate<T>. Милая. Теперь я могу использовать строку:

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

И, без какого-либо кода за файлом, он разбирает! Я отчитаю, если обнаружим, что я сломал что-то еще в этом процессе!

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 --> 
<% } %> 
+0

Ах, извините, мой вопрос, вероятно, не был ясен, но у меня уже есть DataTemplate : класс UserControl, который я пытаюсь использовать в пользовательском ASCX, и избегаю использования частичного класса. – tags2k

+0

Ahh, но зачем же вообще хранить какие-либо вещи в WebForms? Почему бы не пойти на MVC, так как вы не сможете использовать какие-либо компоненты WebForms без VS-порождения частичного класса? – Keith

+0

Это существующее приложение WebForms, которое я стараюсь как можно больше убирать, поэтому я не могу изменить всю архитектуру. Большая часть интерфейсного поколения абстрагируется, поэтому единственное, что мне нужно беспокоиться о поддержании - это MasterPages и эти шаблоны, где это необходимо, которые не нуждаются ни в одном из битов WebForms. – tags2k

Смежные вопросы