ASP.NET - Общие Gotchas

Когда я работаю с ASP.NET, я нахожу, что всегда есть непредвиденные вещи, с которыми я сталкиваюсь, чтобы отлаживать навсегда. Я полагаю, что иметь сводный список из них будет большим для этих "странных ошибок", а также для расширения нашего знания странности на платформе.

Итак: ответьте одним из ваших "Gotcha"!

Я начну: В ASP.NET(VB) выполнение Response.Redirect внутри блока try/catch не останавливает выполнение текущего Response, что может привести к двум одновременным ответам, выполняемым в отношении того же сеанса.

Ответ 1

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

Ответ 2

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

Ответ 3

Весь жизненный цикл в целом.

Не то, чтобы я видел в этом что-то неправильное, просто поразили число людей, которые начинают работать над большими проектами ASP.Net, прежде чем понимать это, а не наоборот. Следовательно, он становится добычей.

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

Ответ 4

Жизненный цикл пользовательских элементов управления не идеально соответствует событиям жизненного цикла страницы с тем же именем.

Ответ 5

Page_Load запускается перед обработчиками. Таким образом, вы не можете вносить изменения в обработчик событий, а затем использовать эти изменения в загрузке страницы. Это становится проблемой, когда у вас есть элементы управления на главной странице (например, элемент управления входами). Вы можете обойти проблему, перенаправив ее, но это определенно получилось.

Ответ 6

Чтобы перейти через обручи, чтобы получить свойство .ClientID в javascript.

Было бы неплохо, если бы этап визуализации жизненного цикла создал script, который настроил var для каждого управляющего сервера с тем же именем, что и элемент управления, который был автоматически инициализирован значением clientID. Или, возможно, есть способ легко вызвать это действие.

Хм... Бьюсь об заклад, я мог бы создать метод для этого самостоятельно через отражение.

Ответ 7

Не редактируйте свой web.config с помощью блокнота, если у вас есть акцентированные символы, он заменит его на неверную кодировку. Это будет выглядеть одинаково. Просто ваше приложение не будет работать.

Ответ 8

Я только что узнал об этом сегодня: метод Bind(), используемый с GridViews и ListViews, не существует. Это на самом деле скрывает магию рефлектора, которая превращает ее в Eval() и какое-то переменное назначение.

В результате это вызывает следующие вызовы:

<%# FormatNameHelper(Bind("Name")) %>

которые выглядят совершенно корректно, не удастся. Подробнее см. этот пост в блоге.

Ответ 9

Отладка - очень интересная функция ASP.Net, но как только вы меняете какой-то код в папке app_code, вы запускаете повторную сборку приложения, что приводит к утере всех сеансов.

Это может раздражать вас при отладке веб-сайта, но вы можете легко предотвратить это, используя режим StateServer: это просто запуск службы и изменение строки в web.config: см. msdn: http://msdn.microsoft.com/en-us/library/ms178586.aspx

  • Режим InProc, который сохраняет состояние сеанса в памяти на веб-сервере. Это значение по умолчанию.
  • Режим StateServer, который сохраняет состояние сеанса в отдельном процессе, называемом службой службы ASP.NET. Это гарантирует сохранение состояния сеанса, если веб-приложение перезапускается, а также делает доступным состояние сеанса для нескольких веб-серверов в веб-ферме.
  • SQL Server...
  • Пользовательский...
  • Off!

Ответ 10

Если вы используете приложения классического ASP в том же виртуальном каталоге, что и приложение ASP.Net, кулак, попавший в приложение, должен быть на странице ASP.Net. Это обеспечит создание AppPool с правильными конфигурациями контекста. Если первая страница будет удалена, это классическая страница ASP, результаты могут отличаться от приложения к приложению. В общем, AppPool настроен на использование последней версии.

Ответ 11

Создание ретрансляторного управления и не знать о INamingContainer.

Ответ 12

  • Вам нужно беспокоиться о тайм-аутах сеанса для приложений, где пользователь может занять много времени.

  • Вам также нужно беспокоиться о загрузке таймаутов для больших приложений тоже

  • Валидаторы могут не всегда прокручивать страницу до места ошибки ввода данных (так что пользователь может ее никогда не увидеть и будет задаваться вопросом, почему кнопка отправки не будет работать)

  • Если пользователь вводит HTML-символы, такие как <, > (например, P > 3.14) или inadvertant <br> из копирования в другую страницу, ASP.NET отклонит страницу и отобразит сообщение об ошибке.

  • null.ToString() вызывает большую жирную ошибку. Проверьте внимательно.

  • Совместное использование пула сеансов в нескольких приложениях - это бесшумное ожидание ожидания

  • Перемещение приложений на машинах с разными средами - мигрень, которая включает web.config и многие потенциальные часы google

  • ASP.NET и MySQL подвержены проблемам кеширования, если вы используете хранимые процедуры

  • AJAX тоже может сделать беспорядок:

    • Бывают ситуации, когда клиент может обойти проверку страницы (особенно нажатием кнопки ENTER вместо нажатия кнопки отправки). Вы можете исправить это, вызвав if(! Page.IsValid) { return ; }
    • Кнопки ASP обычно не работают корректно внутри UpdatePanels
    • Чем больше контента в вашей UpdatePanel, тем больше данных передается асинхронно, поэтому дольше требуется загрузить
    • Если ваша панель AJAX имеет какую-либо проблему или ошибку, она "блокируется" и больше не реагирует на события внутри нее

Ответ 13

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

Ответ 14

При использовании gridview без управления источником данных (т.е. привязки набора данных прямо к элементу управления) вам необходимо вручную выполнить сортировку и события подкачки, как показано здесь:

http://ryanolshan.com/technology/gridview-without-datasourcecontrol-datasource/

Ответ 15

Linq: если вы используете Linq-To-SQL, вы вызываете SubmitChanges() в контексте данных и генерируете исключение (например, дубликат ключа или другое нарушение ограничения), значения оскорбительных объектов остаются в вашей памяти, пока вы отладки и будет повторно отправляться каждый раз, когда вы впоследствии вызываете SubmitChanges().

Теперь вот кикер real: плохие значения останутся в памяти , даже если вы нажмете кнопку "Стоп" в своей среде IDE и перезапустите! Я не понимаю почему кто-то думал, что это хорошая идея, но этот маленький значок ASP.NET, который появляется в вашем системном лотке, остается включенным и, похоже, сохраняет кеш объекта. Если вы хотите очистить пространство памяти, вы должны щелкнуть его правой кнопкой мыши и принудительно закрыть его! GOTCHA!

Ответ 16

Вы не можете ссылаться вообще на корневую папку приложения.

Ответ 17

Весь код, который я должен поддерживать, все еще выглядит так, как будто он написан на vb6, демонстрируя полное незнание новых стилей.

Я говорю такие вещи, как CreateObject(), чрезмерные <%% > блоки, And/Or вместо AndAlso/OrElse, Len() вместо .Length(), s/o Венгерские префиксные бородавки, Dim MyVariable с нет типа, функции без типа возврата... Я мог бы продолжить.

Ответ 18

Не осознавая кучи существующих и расширяемых функциональных возможностей в рамках. Часто повторяются элементы членства, роли, авторизации, карты сайта. Затем есть элементы управления и связанные теги, которые могут быть настроены для облегчения проблем с идентификаторами клиентов среди других. Также такие простые вещи, как незнание правильного использования файла .config для автоматического импорта пространств имен в шаблоны и возможность сделать это на основе каталога. Менее известные вещи, такие как выражения тегов, могут быть полезными и порой. Конечно, как и во всех фреймворках, есть кривая обучения, и всегда остается желать лучшего, однако чаще всего лучше настраивать и расширять существующую структуру вместо того, чтобы сворачивать свои собственные.

Ответ 19

Не чистая вещь ASP.NET, но...

Я пытался использовать либо a) вложенное предложение SELECT, либо b) WITH, и просто не мог заставить его работать, но люди, которые были явно более осведомлены (включая кого-то, с кем я работаю), сказали мне, что синтаксис прекрасен. ВЫКЛЮЧАЕТ...

Не удалось использовать ни один из них с OLEDB.

Ошибка OLEDB для SQL Server

(Кроме того, я был бит response.redirect() в try... catch 'feature', упомянутом в OP! Great thread!)

Ответ 20

Элементы управления базой данных внутри элемента управления INamingContainer не должны размещаться внутри шаблонных элементов управления, таких как FormView. См. этот отчет об ошибках для примера. Поскольку элементы управления INamingContainer создают собственное пространство имен для содержащихся в них элементов управления, двусторонняя привязка данных с использованием Bind() не будет работать должным образом. Но при загрузке значений все будет выглядеть нормально (потому что это делается с помощью Eval()), прежде чем вы попытаетесь отправить обратно значения, которые они таинственно не помещают в базу данных.

Этот вопрос хорошо показывает проблему: AJAX Tabcontainer внутри formview не вставляет значения

Ответ 21

(VB.NET) Если вы отправляете объект через свойство Get Accessor в функцию с ключевым словом ByRef, он фактически попытается обновить объект, используя Set accessor для свойства.

Пример:

UpdateName(ByRef aName as String)

UpdateName(Employee.Name) попытается обновить имя, используя свойство Set on the Name Employee.