Я пытаюсь создать очень и очень простое «микро-веб-приложение», которое, как я подозреваю, будет интересно некоторым пользователям Stack Overflow, если я когда-нибудь это сделаю. Я размещаю его на своем сайте C # in Depth, который является ванильным ASP.NET 3.5 (то есть не MVC).
Схема очень проста:
- Если пользователь входит в приложение с URL-адресом, который не определяет все параметры (или если какой-либо из них недействителен), я хочу просто отобразить элементы управления вводом пользователя. (Их всего два.)
- Если пользователь входит в приложении с URL , который делает имеют все необходимые параметры, я хочу , чтобы отобразить результаты и элементы управления вводом (таким образом они могут изменить параметры)
Вот мои добровольные требования (смесь дизайна и реализации):
- Я хочу, чтобы при отправке использовался GET, а не POST, в основном, чтобы пользователи могли легко добавлять закладки на страницу.
- Я не хочу, чтобы URL-адрес после отправки выглядел глупо с посторонними частями и фрагментами. Только основной URL и реальные параметры, пожалуйста.
- В идеале я бы вообще не хотел использовать JavaScript. В этом приложении нет веских причин для этого.
- Я хочу иметь возможность получать доступ к элементам управления во время рендеринга и устанавливать значения и т. Д. В частности, я хочу иметь возможность устанавливать значения по умолчанию элементов управления на переданные значения параметров, если ASP.NET не может сделать это автоматически. для меня (с другими ограничениями).
- Я счастлив сам выполнить всю проверку параметров, и мне не нужно много событий на стороне сервера. Очень просто настроить все при загрузке страницы вместо того, чтобы прикреплять события к кнопкам и т. Д.
По большей части это нормально, но я не нашел способа полностью удалить состояние просмотра и сохранить остальные полезные функции. Используя сообщение из этого сообщения в блоге, мне удалось избежать получения какого-либо фактического значения для состояния просмотра, но оно по-прежнему остается параметром URL-адреса, что выглядит действительно некрасиво.
Если я сделаю это простой HTML-формой вместо формы ASP.NET (то есть вынимаю runat="server"
), я не получаю никакого волшебного состояния просмотра, но тогда я не могу получить доступ к элементам управления программно.
Я мог бы сделать все это, игнорируя большую часть ASP.NET, создавая XML-документ с LINQ to XML и реализуя его IHttpHandler
. Хотя это кажется немного низким уровнем.
Я понимаю, что мои проблемы можно решить, ослабив мои ограничения (например, используя POST и не заботясь о параметре избытка), или используя ASP.NET MVC, но действительно ли мои требования необоснованны?
Может быть , ASP.NET просто не масштабируется вниз к такому роду приложение? Однако есть очень вероятная альтернатива: я просто дурак, и есть совершенно простой способ сделать это, которого я просто не нашел.
Есть мысли, кто-нибудь? (Подсказка о том, как пали сильные и т. Д. Это нормально - надеюсь, я никогда не утверждал, что был экспертом по ASP.NET, поскольку на самом деле все совсем наоборот ...)
Ответы:
Это решение предоставит вам программный доступ ко всем элементам управления, включая все атрибуты элементов управления. Кроме того, при отправке в URL-адресе будут отображаться только значения текстового поля, поэтому URL-адрес запроса GET будет более "значимым".
Затем в вашем коде программной части вы можете делать все, что вам нужно, на PageLoad.
Если вам не нужна форма, которая есть
runat="server"
, вам следует использовать элементы управления HTML. С ним проще работать для ваших целей. Просто используйте обычные HTML-тегиrunat="server"
и присвойте им идентификатор. Затем вы можете получить к ним программный доступ и код без расширенияViewState
.Единственным недостатком является то, что у вас не будет доступа ко многим «полезным» серверным элементам управления ASP.NET, таким как
GridView
s. Я включил aRepeater
в свой пример, потому что предполагаю, что вы хотите, чтобы поля были на той же странице, что и результаты, и (насколько мне известно) aRepeater
- единственный элемент управления DataBound, который будет работать безrunat="server"
атрибута в теге Form.источник
Вы определенно (ИМХО) на правильном пути, не используя runat = "server" в своем теге FORM. Это просто означает, что вам нужно напрямую извлекать значения из Request.QueryString, как в этом примере:
На самой странице .aspx:
и в коде программной части:
Уловка здесь в том, что мы используем литералы ASP.NET внутри атрибутов value = "" текстовых входов, поэтому сами текстовые поля не должны запускатьat = "server". Затем результаты помещаются в ASP: Panel, а свойство Visible устанавливается при загрузке страницы в зависимости от того, хотите ли вы отображать какие-либо результаты или нет.
источник
Хорошо, Джон, сначала вопрос о состоянии просмотра:
Я не проверял, есть ли какие-либо изменения внутреннего кода с версии 2.0, но вот как я справился с избавлением от состояния просмотра несколько лет назад. На самом деле это скрытое поле жестко запрограммировано внутри HtmlForm, поэтому вам следует создать новое и перейти к его рендерингу, выполняя вызовы самостоятельно. Обратите внимание, что вы также можете оставить __eventtarget и __eventtarget, если вы придерживаетесь простых старых элементов управления вводом (что, я думаю, вы бы захотели, поскольку это также помогает не требовать JS на клиенте):
Итак, вы получаете эти 3 статических MethodInfo и вызываете их, пропуская эту часть состояния просмотра;)
и вот конструктор типа вашей формы:
Если я правильно понимаю ваш вопрос, вы также не хотите использовать POST в качестве действия ваших форм, поэтому вот как вы это сделаете:
Думаю, это в значительной степени все. Дай мне знать, как дела.
РЕДАКТИРОВАТЬ: я забыл методы состояния просмотра страницы:
Итак, ваша настраиваемая форма: HtmlForm получает свою новую абстрактную (или нет) страницу: System.Web.UI.Page: P
В этом случае я запечатываю методы, потому что вы не можете запечатать страницу (даже если она не абстрактная, Скотт Гатри завернет ее в еще одну: P), но вы можете запечатать свою форму.
источник
Вы думали не об удалении POST, а о перенаправлении на подходящий URL-адрес GET при отправке формы. То есть принимайте и GET, и POST, но при POST создайте запрос GET и перенаправьте на него. Это можно сделать либо на странице, либо через HttpModule, если вы хотите сделать его независимым от страницы. Думаю, это упростит задачу.
РЕДАКТИРОВАТЬ: Я предполагаю, что у вас установлен EnableViewState = "false" на странице.
источник
Я бы создал HTTP-модуль, который обрабатывает маршрутизацию (похожий на MVC, но не изощренный, всего пару
if
операторов), и передал бы егоaspx
илиashx
страницам.aspx
предпочтительнее, так как шаблон страницы легче изменить. Однако я бы не стал использоватьWebControls
вaspx
. ПростоResponse.Write
.Кстати, для упрощения вы можете выполнить проверку параметров в модуле (поскольку он, вероятно, использует код совместно с маршрутизацией) и сохранить его,
HttpContext.Items
а затем отобразить на странице. Это будет работать почти так же, как MVC, без всяких наворотов. Этим я много занимался до появления ASP.NET MVC.источник
Я действительно был счастлив полностью отказаться от класса страницы и просто обрабатывать каждый запрос с большим переключением на основе URL-адреса. «Страница» Evey становится шаблоном html и объектом c #. Класс шаблона использует регулярное выражение с делегатом соответствия, который сравнивает с коллекцией ключей.
преимущества:
bummers:
Джон, что мы делаем на SO в субботу утром :)?
источник
Я думал, что asp: Repeater control устарело.
Механизм шаблонов ASP.NET хорош, но вы можете так же легко выполнить повторение с помощью цикла for ...
ASP.NET Forms вроде как в порядке, Visual Studio поддерживает приличную поддержку, но с runat = "server" это просто неправильно. ViewState в.
Я предлагаю вам взглянуть на то, что делает ASP.NET MVC таким замечательным, кто уходит от подхода форм ASP.NET, не отбрасывая его.
Вы даже можете написать свой собственный поставщик сборки для компиляции пользовательских представлений, таких как NHaml. Я думаю, вам следует искать здесь больше контроля и просто полагаться на среду выполнения ASP.NET для обертывания HTTP и в качестве среды размещения CLR. Если вы запустите интегрированный режим, вы также сможете управлять HTTP-запросом / ответом.
источник