Ответ 1
Не динамически добавлять элементы управления после события инициализации страницы, так как это приведет к повреждению дерева viewstate.
Когда я работаю с ASP.NET, я нахожу, что всегда есть непредвиденные вещи, с которыми я сталкиваюсь, чтобы отлаживать навсегда. Я полагаю, что иметь сводный список из них будет большим для этих "странных ошибок", а также для расширения нашего знания странности на платформе.
Итак: ответьте одним из ваших "Gotcha"!
Я начну: В ASP.NET(VB) выполнение Response.Redirect внутри блока try/catch не останавливает выполнение текущего Response, что может привести к двум одновременным ответам, выполняемым в отношении того же сеанса.
Не динамически добавлять элементы управления после события инициализации страницы, так как это приведет к повреждению дерева viewstate.
Viewstate... если вы его используете... может выйти из-под контроля, если вы не обратили на это внимания.
Весь жизненный цикл в целом.
Не то, чтобы я видел в этом что-то неправильное, просто поразили число людей, которые начинают работать над большими проектами ASP.Net, прежде чем понимать это, а не наоборот. Следовательно, он становится добычей.
Обратите внимание, что я сказал о больших проектах: я думаю, что лучший способ прийти к соглашению с жизненным циклом - сначала работать над несколькими более мелкими проектами, где это не имеет значения, если вы их испортите.
Жизненный цикл пользовательских элементов управления не идеально соответствует событиям жизненного цикла страницы с тем же именем.
Page_Load запускается перед обработчиками. Таким образом, вы не можете вносить изменения в обработчик событий, а затем использовать эти изменения в загрузке страницы. Это становится проблемой, когда у вас есть элементы управления на главной странице (например, элемент управления входами). Вы можете обойти проблему, перенаправив ее, но это определенно получилось.
Чтобы перейти через обручи, чтобы получить свойство .ClientID в javascript.
Было бы неплохо, если бы этап визуализации жизненного цикла создал script, который настроил var для каждого управляющего сервера с тем же именем, что и элемент управления, который был автоматически инициализирован значением clientID. Или, возможно, есть способ легко вызвать это действие.
Хм... Бьюсь об заклад, я мог бы создать метод для этого самостоятельно через отражение.
Не редактируйте свой web.config с помощью блокнота, если у вас есть акцентированные символы, он заменит его на неверную кодировку. Это будет выглядеть одинаково. Просто ваше приложение не будет работать.
Я только что узнал об этом сегодня: метод Bind(), используемый с GridViews и ListViews, не существует. Это на самом деле скрывает магию рефлектора, которая превращает ее в Eval() и какое-то переменное назначение.
В результате это вызывает следующие вызовы:
<%# FormatNameHelper(Bind("Name")) %>
которые выглядят совершенно корректно, не удастся. Подробнее см. этот пост в блоге.
Отладка - очень интересная функция ASP.Net, но как только вы меняете какой-то код в папке app_code, вы запускаете повторную сборку приложения, что приводит к утере всех сеансов.
Это может раздражать вас при отладке веб-сайта, но вы можете легко предотвратить это, используя режим StateServer: это просто запуск службы и изменение строки в web.config: см. msdn: http://msdn.microsoft.com/en-us/library/ms178586.aspx
Если вы используете приложения классического ASP в том же виртуальном каталоге, что и приложение ASP.Net, кулак, попавший в приложение, должен быть на странице ASP.Net. Это обеспечит создание AppPool с правильными конфигурациями контекста. Если первая страница будет удалена, это классическая страница ASP, результаты могут отличаться от приложения к приложению. В общем, AppPool настроен на использование последней версии.
Создание ретрансляторного управления и не знать о INamingContainer
.
Вам нужно беспокоиться о тайм-аутах сеанса для приложений, где пользователь может занять много времени.
Вам также нужно беспокоиться о загрузке таймаутов для больших приложений тоже
Валидаторы могут не всегда прокручивать страницу до места ошибки ввода данных (так что пользователь может ее никогда не увидеть и будет задаваться вопросом, почему кнопка отправки не будет работать)
Если пользователь вводит HTML-символы, такие как <
, >
(например, P > 3.14
) или inadvertant <br>
из копирования в другую страницу, ASP.NET отклонит страницу и отобразит сообщение об ошибке.
null.ToString()
вызывает большую жирную ошибку. Проверьте внимательно.
Совместное использование пула сеансов в нескольких приложениях - это бесшумное ожидание ожидания
Перемещение приложений на машинах с разными средами - мигрень, которая включает web.config
и многие потенциальные часы google
ASP.NET и MySQL подвержены проблемам кеширования, если вы используете хранимые процедуры
AJAX тоже может сделать беспорядок:
if(! Page.IsValid) { return ; }
Пользовательские элементы управления поддерживаются разработчиком только при создании элемента управления или при создании страницы, использующей элемент управления, но не для обоих.
При использовании gridview без управления источником данных (т.е. привязки набора данных прямо к элементу управления) вам необходимо вручную выполнить сортировку и события подкачки, как показано здесь:
http://ryanolshan.com/technology/gridview-without-datasourcecontrol-datasource/
Linq: если вы используете Linq-To-SQL, вы вызываете SubmitChanges()
в контексте данных и генерируете исключение (например, дубликат ключа или другое нарушение ограничения), значения оскорбительных объектов остаются в вашей памяти, пока вы отладки и будет повторно отправляться каждый раз, когда вы впоследствии вызываете SubmitChanges()
.
Теперь вот кикер real: плохие значения останутся в памяти , даже если вы нажмете кнопку "Стоп" в своей среде IDE и перезапустите! Я не понимаю почему кто-то думал, что это хорошая идея, но этот маленький значок ASP.NET, который появляется в вашем системном лотке, остается включенным и, похоже, сохраняет кеш объекта. Если вы хотите очистить пространство памяти, вы должны щелкнуть его правой кнопкой мыши и принудительно закрыть его! GOTCHA!
Вы не можете ссылаться вообще на корневую папку приложения.
Весь код, который я должен поддерживать, все еще выглядит так, как будто он написан на vb6, демонстрируя полное незнание новых стилей.
Я говорю такие вещи, как CreateObject(), чрезмерные <%% > блоки, And/Or вместо AndAlso/OrElse, Len() вместо .Length(), s/o Венгерские префиксные бородавки, Dim MyVariable с нет типа, функции без типа возврата... Я мог бы продолжить.
Не осознавая кучи существующих и расширяемых функциональных возможностей в рамках. Часто повторяются элементы членства, роли, авторизации, карты сайта. Затем есть элементы управления и связанные теги, которые могут быть настроены для облегчения проблем с идентификаторами клиентов среди других. Также такие простые вещи, как незнание правильного использования файла .config для автоматического импорта пространств имен в шаблоны и возможность сделать это на основе каталога. Менее известные вещи, такие как выражения тегов, могут быть полезными и порой. Конечно, как и во всех фреймворках, есть кривая обучения, и всегда остается желать лучшего, однако чаще всего лучше настраивать и расширять существующую структуру вместо того, чтобы сворачивать свои собственные.
Не чистая вещь ASP.NET, но...
Я пытался использовать либо a) вложенное предложение SELECT, либо b) WITH, и просто не мог заставить его работать, но люди, которые были явно более осведомлены (включая кого-то, с кем я работаю), сказали мне, что синтаксис прекрасен. ВЫКЛЮЧАЕТ...
Не удалось использовать ни один из них с OLEDB.
(Кроме того, я был бит response.redirect() в try... catch 'feature', упомянутом в OP! Great thread!)
Элементы управления базой данных внутри элемента управления INamingContainer не должны размещаться внутри шаблонных элементов управления, таких как FormView. См. этот отчет об ошибках для примера. Поскольку элементы управления INamingContainer создают собственное пространство имен для содержащихся в них элементов управления, двусторонняя привязка данных с использованием Bind() не будет работать должным образом. Но при загрузке значений все будет выглядеть нормально (потому что это делается с помощью Eval()), прежде чем вы попытаетесь отправить обратно значения, которые они таинственно не помещают в базу данных.
Этот вопрос хорошо показывает проблему: AJAX Tabcontainer внутри formview не вставляет значения
(VB.NET) Если вы отправляете объект через свойство Get Accessor в функцию с ключевым словом ByRef, он фактически попытается обновить объект, используя Set accessor для свойства.
Пример:
UpdateName(ByRef aName as String)
UpdateName(Employee.Name)
попытается обновить имя, используя свойство Set on the Name Employee.