Веб-формы ASP.NET как ASP.NET MVC - PullRequest
       12

Веб-формы ASP.NET как ASP.NET MVC

2 голосов
/ 22 февраля 2009

Я прошу прощения за возможное введение в заблуждение относительно названия, но я понятия не имею о правильном названии.

Не стесняйтесь редактировать.

В любом случае, я использую веб-формы ASP.NET, и, возможно, это не то, как веб-формы предназначены для использования, но мне нравится создавать и заполнять HTML-элементы вручную. Это дает мне больше контроля.

Я не использую DataBinding и тому подобное. Я использую SqlConnection, SqlCommand и SqlDataReader, задаю строку SQL и т. Д. И читаю данные из DataReader. Старая школа, если хотите. :)

Я создаю WebControls, так что мне не нужно копировать-вставлять каждый раз, когда мне нужен какой-то элемент управления, но в основном мне нужны WebControls для рендеринга в виде HTML, чтобы я мог добавить этот HTML в некоторую другую функцию, которая отображает окончательный результат с контролем внутри.

Я знаю, что могу отобразить элемент управления с помощью control.RenderControl (writer), но это можно сделать только в (пред) переопределениях Render или RenderContents.

Например.

У меня есть файл dal.cs, где хранятся все статические функции и пустоты, которые связываются с базой данных. Функции в основном возвращают строку, чтобы ее можно было добавить в какую-то другую функцию для отображения окончательного результата.

Причина, по которой я так поступаю, заключается в том, что я хочу отделить кодирование от HTML настолько, насколько могу, чтобы я не делал <% while (dataReader.Read ())%> в HTML и отображал данные. Я переместил это в CodeBehind. Я также использую эти функции для рендеринга в HttpHandler для ответа AJAX.

Это прекрасно работает, но когда я хочу добавить элемент управления (элемент управления ASP.NET Server (расширение .cs, а не .ascx)), я не знаю, как это сделать, поэтому я вижу, что сам пишу тот же элемент управления как функция, которая возвращает строку или другую функцию внутри этого элемента управления, которая возвращает строку и заменяет задание, которое будет выполнять RenderContents, чтобы я мог вызвать эту функцию, когда мне нужно добавить элемент управления в другую строку. Я знаю, что это не очень хорошая практика.

Поскольку я вижу все учебные пособия / видео о ASP.NET MVC, я думаю, что это соответствует моим потребностям, так как с MVC вы должны создавать все (или большую часть) самостоятельно, что я уже делаю сейчас с веб-формами.

После этого длинного вступления я хочу спросить, как я могу построить свои элементы управления, чтобы я мог использовать их, как я уже упоминал (возвращаемая строка), или я должен забыть о серверных элементах управления и создать элементы управления как функции и использовать их таким образом? Возможно ли это даже с ASP.NET Server Controls (расширение .cs) или я прав, когда сказал, что не правильно его использую.

Чтобы было ясно, я говорю о том, как правильно использовать веб-формы, но избегать связывателей данных, потому что я хочу создавать все самостоятельно (рендерить HTML в Code Behind).
Кто-то может подумать, что я добавляю строки вроде «some» + «string», что я не являюсь. Я использую StringBuilder для этого, поэтому нет медлительности.

Любое мнение приветствуется.

Ответы [ 6 ]

7 голосов
/ 22 февраля 2009

Вам нужно перестать думать с точки зрения «контроля» и веб-форм. MVC - это совершенно другой способ конструирования приложений.

Я также ненавижу автоматические средства рендеринга в WebForms, они создают ужасный HTML, который никогда не имеет никакого смысла. Тем не менее, вы не хотите писать html в своем коде и передавать его в виде строк, это просто противно. Код вашей презентации смешан с вашей логикой, И вы пишете HTML в строках c # !!!

Итак, MVC ... Вместо "виджетов", которые взаимодействуют друг с другом с помощью codebehind и postback'ов, ваш просмотр отображает ТОЛЬКО данные и содержит формы, позволяющие отправлять сообщения на контроллеры.

Из-за этого вы можете строго ввести ваши представления в тип, а затем получить доступ к данным, которые вы передаете ему из контроллера, через свойство Model. Эквивалентом UserControls являются частичные представления (ViewUserControl), которые можно использовать для модуляции кода рендеринга для типов. Например, вы можете сделать адрес частичным, которому вы передаете свойство Address вашего Address каждый раз, когда вам нужно его отобразить. Таким образом, вы не будете повторять html повсюду.

P.S. Один файл для всего вашего DAL?

6 голосов
/ 22 февраля 2009

Я надеюсь, что никогда когда-либо придется работать над приложением, которое вы написали таким образом. Если ваше приложение сильно загружено, значит что-то не так.

1 голос
/ 22 февраля 2009

Согласитесь с @sliderhouserules, то, как вы используете MVC framework, ужасно. Вы должны забыть все ваши методы "старой школы". Вы никогда не должны использовать SqlCommands, SqlReaders и т. Д. В коде страниц. Вы должны перейти к представлению только модель (например, представление (бар)), и будет лучше, если вы будете избегать использования

ViewData["some magic string"] = bar

Каждый раз, когда вы будете использовать технику "старой школы", будут убиты 2 человека и 2 кошки:).
Также лучше использовать ORM (Object-Relational Mapper), например, Linq2sql, NHibernate, SubSonic и т. Д.
Если вам нужны образцы хорошего дизайна приложения, посмотрите SharpArchitecture . Он имеет очень хорошую архитектуру и реализацию и может сильно помочь. У него есть один образец (с базой данных Northwind), и скоро будет добавлен еще один образец.
Также посмотрите на CodeCampServer . У него тоже очень хорошая архитектура.
Лучше смотреть код этих проектов, а не смотреть видео, потому что существующие видео не могут продемонстрировать хороший образец архитектуры, просто простое использование функциональности.
Что касается серверных элементов управления, вы можете использовать их, если они могут быть использованы без 'runat = "server"', например PlaceHolder. И вы можете создавать их тоже, но вы не должны загружать какие-либо данные в них напрямую. Если вы не хотите копировать и вставлять html, вы должны просмотреть свой код и реорганизовать его. Каждый дублированный код должен быть перемещен в MasterPages of UserControls (ascx).
И еще раз, пожалуйста, потратьте некоторое время, чтобы посмотреть на эти образцы. В будущем вы сэкономите нервы и время, когда вам нужно будет обновить приложение или что-то исправить. С первого взгляда их трудно понять, но это только на первый взгляд. Надеюсь, это поможет.

0 голосов
/ 21 мая 2010

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

Подробнее

На мой взгляд, прочитайте несколько статей о принципе Разделение проблем (также известном как SoC). Если вы примените его правильно, это может избавить вас от многих головной боли при отладке приложения, а также для тех людей, с которыми вы работаете (например, тех, кому, возможно, придется читать или изменять ваш исходный код).

Мой другой совет для вас:
Вы правы, что вы не должны делать что-то вроде <% while (dataReader.Read()) %> в вашем коде View. Но, возможно, есть лучшие способы сделать его более элегантным, чем ваш нынешний способ.

Я думаю, вам следует рассмотреть возможность использования какого-либо типа ORM для этих целей. (LINQ to SQL или даже NHibernate.) Если вы его получите, это будет намного проще. Настолько, что вы, возможно, не захотите снова использовать DataReader s напрямую. : -)

Что я тебе рекомендую

Просто прочитайте учебник NerdDinner и постройте приложение samle самостоятельно, шаг за шагом.
После этого попробуйте самостоятельно создать аналогичное приложение, которое служит другой цели, применяя те же правила и дизайн, которые вы применили к учебнику.

Я почти уверен, что у вас есть опыт, чтобы сделать это, и после того, как вы действительно с ним что-то сделаете, вы сможете ощутить это.

Учебное пособие также объясняет и включает в себя принципы, которые я упоминал выше, которые будут очень полезны для вас.

0 голосов
/ 03 мая 2009

Рассматривали ли вы использование микро-шаблонов ? У Дейва Уорда есть хороший пример ретранслятора данных на стороне клиента , который использует микро-шаблоны для макета после вызова метода страницы. Похоже, это больше соответствует духу того, что вы пытаетесь достичь, и все еще может быть прекрасно интегрировано с WebForms.

Побочным эффектом будет то, что вы не будете полагаться на передачу HTML и сможете изолировать вашу презентацию от вашей логики.

0 голосов
/ 23 февраля 2009

Если вы хотите путь ASP.NET MVC, вы можете настроить элементы управления как ASCX, и они будут просто тегами, заполненными контроллером. Однако вам может быть недостаточно старой школы.

Вы можете создать свой полный пользовательский интерфейс в коде, если хотите. Это может включать создание HTML в подпрограммах.

Но я бы рекомендовал, если вы придерживаетесь ASP.NET, пересмотреть модель связывания через DataReader.Read () и цикл output +. Это не только старый стиль, он крайне неэффективен и его трудно поддерживать.

ASP.NET MVC создает гораздо более слабый ASPX, поскольку это просто представление. И есть гораздо большее разделение кода и пользовательского интерфейса. Но это не будет соответствовать модели старой школы.

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