ASP.Net MVC: Создавать пользовательские элементы управления немного грязно? - PullRequest
2 голосов
/ 12 июня 2009

Основной вопрос: есть ли лучший способ выполнить создание элемента управления многократного использования?

Таким образом, идея состояла в том, чтобы создать элемент управления подкачкой, чтобы по существу перестать вводить практически одинаковую разметку для нескольких представлений. Это принимает это:

 <%= Html.ActionLink("First", "Details", new RouteValueDictionary(new { parentForumId = Model.TopicId, pageNumber = Model.FirstPage, amountToShow = Model.AmountToShow }))%>
 | 
 <%= Html.ActionLink("Previous", "Details", new RouteValueDictionary(new { parentForumId = Model.TopicId, pageNumber = Model.PreviousPage, amountToShow = Model.AmountToShow }))%>
 |
 <%= Html.ActionLink("Next", "Details", new RouteValueDictionary(new { parentForumId = Model.TopicId, pageNumber = Model.NextPage, amountToShow = Model.AmountToShow }))%>
 |
 <%= Html.ActionLink("Last", "Details", new RouteValueDictionary(new { parentForumId = Model.TopicId, pageNumber = Model.LastPage, amountToShow = Model.AmountToShow }))%>

И превращая это в это:

<%= Html.Pager("View", "Controller", "RouteName", Model, new Dictionary<String, Object> { {"parentForumId", Model.ParentForumId}}, " ") %>

Где, как вы можете видеть, я передаю нужный вид, контроллер, имя маршрута, модель и словарь, используемый для добавления переменных запроса в URL для ссылки.

Я обнаружил, что мне нужно создать метод расширения для класса HtmlHelper и по существу взять то, что в ASP.Net было полным классом (с хорошими методами, такими как CreateChildControls), и объединить все это в один основной метод, который возвращает строка.

Это предпочтительный способ сделать это? Одной из приятных особенностей ASP.Net была разметка для класса, так как у вас есть тег разметки html, который будет переводить свойства разметки в свойства класса. Это вообще сделано для более чистой разметки, но по общему признанию "поддельный" html. В этой ситуации у меня есть метод, который может быть подписью html длиной в милю. А поскольку у меня нет базового класса WebControl, каждый элемент управления, который я создаю, должен иметь вызовы методов с такими же базовыми потребностями, как, например, CssClass или ID.

Теперь, с учетом сказанного, я полагаю, что мог бы передать словарь атрибутов, так как HtmlHelper.GenerateRouteLink метод, который я использую, вызывает один раз, но это действительно кажется очень грязным.

Есть ли лучший способ сделать это?

Ответы [ 4 ]

5 голосов
/ 12 июня 2009

Во-первых, это все ASP.NET ... один - MVC, другой - WebForms. Мне потребовалось несколько секунд, чтобы понять, что вы говорили, когда продолжали говорить «путь ASP.NET». : P

Идея с MVC заключается в том, что ваше представление «тупое», без какого-либо реального поведения за пределами абсолютно голых основ для визуализации данных. В WebForms представления были тесно связаны с их отображением и обрабатывали события представления. Это, хотя и удобно, делало представления WebForms очень сложными для модульного тестирования, так как содержимое и поведение представления были связаны, а иногда и смешаны.

Причина, по которой представления MVC используют такие вещи, как HtmlHelper и AjaxHelper, заключается в том, чтобы сохранить поведение как можно более отделенным от представления. В отличие от пользовательского или серверного элемента управления в WebForms, вы можете полностью выполнить модульное тестирование метода расширения Html.Pager, поскольку логика - это чистый код, без смешения этих проблем пользовательского интерфейса или связи с кучей непроверяемых типов уровней пользовательского интерфейса. То же самое общее правило применяется к контроллерам MVC, чтобы ... они являются просто кодом, не связанным с событиями или чем-то подобным.

Это может быть менее удобно в краткосрочной перспективе, так как вы в настоящее время привыкли к старому способу работы с WebForms. Однако уделите себе немного времени, и вы, вероятно, начнете осознавать преимущества, которые предпочитает MVC. Написание метода расширения Pager на HtmlHelper действительно является предпочтительным способом работы с MVC.

Что касается бита подписи длиной в милю ... выполните поиск (попробуйте Bing.com!) Для свободно используемых стилей интерфейсов и HtmlHelper. Свободный стиль начинает крепко держаться в таких средах, как представления MVC, где вы, вероятно, будете иметь огромные подписи. Общая идея основана на цепочках методов, вроде jQuery, и может сократить эти длинные сигнатуры до серии гораздо более коротких и более значимых вызовов методов с цепочкой, которые устанавливают ваш html-помощник, с последним вызовом метода .Render или чего-то в этом роде. аналогичный.

2 голосов
/ 12 июня 2009

Вы можете поместить его в частичное представление вместо создания помощника.

1 голос
/ 12 июня 2009

Мы используем HTML-помощники для разбивки на страницы, так как они просты в модульном тестировании. Бизнес-требования нумерации страниц могут быть привередливыми.

"Показать менее 35 ссылок в виде чисел, затем сгруппировать по 20 с, если не будет более 100 страниц результатов, в этом случае сгруппируйте по 100 ... но по четвергам или в GoogleBot покажите их как ... и т.д. «.

Кроме того, наши SEO-ребята постоянно меняют свое мнение о том, какие URL-адреса получают больше всего сока. В такой ситуации обязательно нужно что-то проверить на модуле!

1 голос
/ 12 июня 2009

Возможно, вы захотите проверить Пейджер Martijn Boland для вдохновения.

Лично для моего повторно используемого элемента управления сеткой я использую класс, который содержит всю информацию, необходимую для создания сетки с разбивкой по страницам, сортировкой и т. Д., И я вызываю частичные представления для создания отдельных элементов (пейджер, выбор столбцов, выбор размера страницы, ...), передавая им требуемую информацию.

Таким образом, я могу легко расширить сетку с помощью пользовательских вещей. Например, я могу создать представление Mygrid_editableTable.ascx, чтобы показывать текстовые поля вместо просто текста, и добавить дополнительный столбец с кнопкой отправки. Это при продолжении использования подкачки, выбора страницы, ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...