Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. При тестировании можно было отправить электронные письма в папку на компьютере вместо сервера SMTP. Поместите это в свой web.config:
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
</smtp>
</mailSettings>
</system.net>
Прежде чем ASP.NET v3.5 добавил маршруты, в которые Вы могли создать свои собственные дружественные URL просто путем записи HTTPModule и переписать запрос рано в конвейере страницы (как событие BeginRequest).
URL как http://servername/page/Param1/SomeParams1/Param2/SomeParams2 отобразить на другой странице как ниже (часто использующий регулярные выражения).
HttpContext.RewritePath("PageHandler.aspx?Param1=SomeParms1&Param2=SomeParams2");
DotNetNuke имеет действительно хороший HttpModule, который делает это для их дружественных URL. Все еще полезно для машин, где Вы не можете развернуть.NET v3.5.
Если у Вас будет ASP.NET, генерирующий канал RSS, он будет иногда помещать дополнительную строку в верхней части страницы. Это не проверит с общими блоками проверки допустимости RSS. Можно работать вокруг этого путем помещения директивы <@Page>
страницы внизу страницы.
По умолчанию любое содержание между тегами для пользовательского элемента управления добавляется как дочерний элемент управления. Это может быть прервано в AddParsedSubObject () переопределение для фильтрации или дополнительного парсинга (например, текстового содержания в LiteralControls):
protected override void AddParsedSubObject(object obj)
{ var literal = obj as LiteralControl;
if (literal != null) Controls.Add(parseControl(literal.Text));
else base.AddParsedSubObject(obj);
}
...
<uc:MyControl runat='server'>
...this text is parsed as a LiteralControl...
</uc:MyControl>
HttpModules. Архитектура сумасшедшая изящный. Возможно, не скрытая функция, но прохладный тем не менее.
HttpContext. Текущий будет всегда предоставлять Вам доступ к Запросу/Ответу/и т.д. текущего контекста., даже когда у Вас нет доступа к свойствам Страницы (например, от слабо связанного класса помощника).
можно продолжить выполнять код на той же странице после перенаправления пользователя к другому путем вызова Ответ. Перенаправление ( url, ложь )
Вам не нужно .ASPX файлы, если все, что Вы хотите, является скомпилированным Страница (или какой-либо IHttpHandler). Просто установите путь и методы HTTP для указания на класс в <httpHandlers>
элемент в web.config файле.
А объект Страницы может быть получен от файл.ASPX программно путем вызова PageParser. GetCompiledPageInstance (virtualPath, aspxFileName, Контекст)
Включение intellisense для MasterPages на страницах содержания
я уверен, что это очень мало известно, взламывают
Большую часть времени, необходимо использовать findcontrol метод и бросить средства управления на основной странице от страниц содержания, когда Вы захотите использовать их, , директива MasterType включит intellisense в Visual Studio, после того как Вы к этому
просто добавляете еще одну директиву к странице
<%@ MasterType VirtualPath="~/Masters/MyMainMasterPage.master" %>
, Если Вы не хотите использовать Виртуальный тракт и использовать имя класса вместо этого затем
<%@ MasterType TypeName="MyMainMasterPage" %>
, Получают полный текст статьи здесь
HttpContext. Объекты как инструмент кэширования уровня запроса
Две вещи выделяются в моей голове:
1) можно включить и выключить Трассировку от кода:
#ifdef DEBUG
if (Context.Request.QueryString["DoTrace"] == "true")
{
Trace.IsEnabled = true;
Trace.Write("Application:TraceStarted");
}
#endif
2) можно создать несколько .aspx страниц с помощью только одного общего "кода - позади" файла.
Сборка один класс .cs файл:
public class Class1:System.Web.UI.Page
{
public TextBox tbLogin;
protected void Page_Load(object sender, EventArgs e)
{
if (tbLogin!=null)
tbLogin.Text = "Hello World";
}
}
и затем у Вас может быть любое число .aspx страниц (после удаления .designer.cs и кода .cs - позади того, который VS генерировал):
<%@ Page Language="C#" AutoEventWireup="true" Inherits="Namespace.Class1" %>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="tbLogin" runat="server"></asp: TextBox >
</div>
</form>
у Вас могут быть средства управления в ASPX, которые не появляются в Class1, и наоборот, но Вы должны к remeber проверить свои средства управления на пустые указатели.
Можно использовать:
Request.Params[Control.UniqueId]
Для получения значения управления, ПРЕЖДЕ ЧЕМ состояние отображения инициализируется (Управление. Текст и т.д. будет пуст в этой точке).
Это полезно для кода в Init.
HttpContext. IsCustomErrorEnabled является замечательной функцией. Я нашел его полезным несколько раз. Вот короткое сообщение об этом.
Можно использовать Комментарии ASP.NET в .aspx странице, чтобы прокомментировать полные части страницы включая управление сервером. И содержание, который комментируется, никогда не будет отправляться клиенту.
<%--
<div>
<asp:Button runat="server" id="btnOne"/>
</div>
--%>
Построитель выражений Кода
Демонстрационная разметка:
Text = '<%$ Code: GetText() %>'
Text = '<%$ Code: MyStaticClass.MyStaticProperty %>'
Text = '<%$ Code: DateTime.Now.ToShortDateString() %>'
MaxLenth = '<%$ Code: 30 + 40 %>'
реальная красота построителя выражений кода состоит в том, что можно использовать привязку данных как выражения в непривязке данных ситуаций. Можно также создать другие Построители выражений, которые выполняют другие функции.
web.config:
<system.web>
<compilation debug="true">
<expressionBuilders>
<add expressionPrefix="Code" type="CodeExpressionBuilder" />
cs класс, который заставляет все это произойти:
[ExpressionPrefix("Code")]
public class CodeExpressionBuilder : ExpressionBuilder
{
public override CodeExpression GetCodeExpression(
BoundPropertyEntry entry,
object parsedData,
ExpressionBuilderContext context)
{
return new CodeSnippetExpression(entry.Expression);
}
}
Использование типа файла ASHX:
, Если Вы хотите просто произвести некоторый основной HTML или xml, не проходя обработчики событий страницы затем, можно реализовать HttpModule простым способом
Имя страница как SomeHandlerPage.ashx и просто поместить ниже кода (всего одна строка) в нем
<%@ webhandler language="C#" class="MyNamespace.MyHandler" %>
Затем файл кода
using System;
using System.IO;
using System.Web;
namespace MyNamespace
{
public class MyHandler: IHttpHandler
{
public void ProcessRequest (HttpContext context)
{
context.Response.ContentType = "text/xml";
string myString = SomeLibrary.SomeClass.SomeMethod();
context.Response.Write(myString);
}
public bool IsReusable
{
get { return true; }
}
}
}
Свойства Управления сервером Установки На основе Целевого браузера и [еще 112] .
<asp:Label runat="server" ID="labelText" ie:Text="This is IE text" mozilla:Text="This is Firefox text" Text="This is general text" />
, Что каждый отчасти застал меня врасплох.
Я работал над приложением asp.net, которое прошло проверку защиты ведущей компанией по обеспечению безопасности, и я изучил этот легкий прием предотвращению менее известной, но важной уязвимости системы обеспечения безопасности.
ниже объяснения от: http://www.guidanceshare.com/wiki/ASP.NET_2.0_Security_Guidelines_-_Parameter_Manipulation#Consider_Using_Page.ViewStateUserKey_to_Counter_One-Click_Attacks
Рассматривает использование Страницы. ViewStateUserKey для противостояния нападениям с одним щелчком. Если Вы аутентифицируете свои вызывающие стороны и используете ViewState, устанавливаете Страницу. Свойство ViewStateUserKey в обработчике событий Page_Init для предотвращения нападений с одним щелчком.
void Page_Init (object sender, EventArgs e) {
ViewStateUserKey = Session.SessionID;
}
Набор свойство к значению, которое Вы знаете, уникально для каждого пользователя, таково как идентификатор сессии, имя пользователя или идентификатор пользователя.
нападение одного щелчка А происходит, когда взломщик создает Веб-страницу (.htm или .aspx), который содержит скрытое поле формы, названное __ СОСТОЯНИЕ ОТОБРАЖЕНИЯ, которое уже заполнено данными ViewState. ViewState может быть сгенерирован от страницы, которую взломщик ранее создал, такие как страница магазинной тележки с 100 объектами. Взломщик соблазняет не подозревающего пользователя в просмотр к странице, и затем взломщик заставляет страницу быть отправленной на сервер, где ViewState допустим. Сервер не имеет никакого способа знать что ViewState, порожденный от взломщика. Проверка ViewState и HMACs не противостоят этому нападению, потому что ViewState допустим, и страница выполняется под контекстом защиты пользователя.
установка By свойство ViewStateUserKey, когда обзоры взломщика к странице для создания ViewState свойство инициализируется к его имени. Когда законный пользователь отправляет страницу серверу, она инициализируется с именем взломщика. В результате сбои проверки ViewState HMAC и исключение сгенерированы.
HttpContext. Текущий. IsDebuggingEnabled
Здорово для определения, какие сценарии произвести (минута или полные версии) или что-либо еще Вы могли бы хотеть в dev, но не живые.
Включенный в ASP.NET 3,5 SP1:
ScottGu имеет набор приемов в http://weblogs.asp.net/scottgu/archive/2006/04/03/441787.aspx
throw new HttpException(404, "Article not found");
Это будет поймано ASP.NET, который возвратит customErrors страницу. Ставший известный об этом в недавнее Сообщение Совета дня.NET
При размещении файла, названного app_offline.htm в корне каталога веб-приложения ASP.NET 2.0 + завершит работу приложения и остановит нормальную обработку любых новых входящих запросов на то приложение, показывая только содержание файла app_offline.htm для всех новых запросов .
Это - самый быстрый и самый легкий способ отобразить Ваш "Сайт Временно Недоступное" уведомление при повторном развертывании (или откате) изменения в Рабочем сервере.
кроме того, как указано marxidad, удостоверьтесь, что у Вас есть по крайней мере 512 байтов содержания в файле, таким образом, IE6 представит его правильно.
Режим розничной торговли на уровне machine.config:
<configuration>
<system.web>
<deployment retail="true"/>
</system.web>
</configuration>
Переопределяет параметры web.config, чтобы принудительно установить отладку на false, включает настраиваемые ошибки и отключает трассировку. Больше не нужно забывать изменять атрибуты перед публикацией - просто оставьте их все настроенными для сред разработки или тестирования и обновите настройки розничной торговли.
Вот лучший. Добавьте это в свой web.config для НАМНОГО более быстрой компиляции. Это сообщение 3.5SP1 через этот QFE .
<compilation optimizeCompilations="true">
Краткое резюме: мы представляем новый переключатель optimizeCompilations в ASP.NET, который может значительно улучшить скорость компиляции в некоторых сценариях. Есть некоторые уловки, так что читайте дальше подробнее. Этот переключатель в настоящее время доступен как QFE для 3.5SP1 и будет частью VS 2010.
Система компиляции ASP.NET требует очень консервативный подход, который заставляет его стереть все предыдущие работа, которую он делал в любое время level 'изменяется. Файлы верхнего уровня включить что-нибудь в bin и App_Code, а также global.asax. Пока это отлично работает для небольших приложений, становится почти непригоден для очень больших приложений. Например, клиент столкнулся с случай, когда требовалось 10 минут, чтобы обновите страницу после внесения любых изменений в сборку корзины.
Чтобы облегчить боль, мы добавили "оптимизированный" режим компиляции, который требует гораздо менее консервативного подход к перекомпиляции.
Через здесь :
WebMethods.
Вы можете использовать обратные вызовы ASP.NET AJAX для веб-методов, размещенных на страницах ASPX. Вы можете украсить статический метод атрибутами [WebMethod ()] и [ScriptMethod ()]. Например:
[System.Web.Services.WebMethod()]
[System.Web.Script.Services.ScriptMethod()]
public static List<string> GetFruitBeginingWith(string letter)
{
List<string> products = new List<string>()
{
"Apple", "Banana", "Blackberry", "Blueberries", "Orange", "Mango", "Melon", "Peach"
};
return products.Where(p => p.StartsWith(letter)).ToList();
}
Теперь на странице ASPX вы можете сделать следующее:
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
<input type="button" value="Get Fruit" onclick="GetFruit('B')" />
</div>
</form>
И вызвать метод на стороне сервера через JavaScript, используя:
<script type="text/javascript">
function GetFruit(l)
{
PageMethods.GetFruitBeginingWith(l, OnGetFruitComplete);
}
function OnGetFruitComplete(result)
{
alert("You got fruit: " + result);
}
</script>
Одна малоизвестная и редко используемая функция ASP.NET:
Она редко используется, потому что есть только конкретная ситуация, когда она вам понадобится, но когда вы нужно, это так удобно.
Некоторые статьи об этой малоизвестной функции:
Отображение тегов в ASP.NET
Использование отображения тегов в ASP.NET 2.0
и от этого последняя статья:
Отображение тегов позволяет менять местами совместимые элементы управления во время компиляции на на каждой странице вашего веб-приложения. А полезный пример: если у вас есть запас Элемент управления ASP.NET, например DropDownList, и вы хотите заменить это с настраиваемым элементом управления, который полученный из DropDownList. Это могло, это может быть элементом управления, который был настроен чтобы обеспечить более оптимизированное кеширование данные поиска. Вместо того, чтобы редактировать каждый веб-форму и замену встроенной DropDownLists с вашим индивидуальным версия, вы можете иметь ASP.NET в эффект сделай это за тебя, изменив web.config:
<pages>
<tagMapping>
<clear />
<add tagType="System.Web.UI.WebControls.DropDownList"
mappedTagType="SmartDropDown"/>
</tagMapping>
</pages>
Атрибут MaintainScrollPositionOnPostback в директиве Page. Он используется для сохранения положения прокрутки страницы aspx при обратных передачах.
Свойство DefaultButton в панелях.
Устанавливает кнопку по умолчанию для конкретной панели.
Перед запуском длительной задачи проверьте, подключен ли клиент по-прежнему:
if (this.Response.IsClientConnected)
{
// long-running task
}
Допустимый синтаксис, на котором дросселирует VS:
<input type="checkbox" name="roles" value='<%# Eval("Name") %>'
<%# ((bool) Eval("InRole")) ? "checked" : "" %>
<%# ViewData.Model.IsInRole("Admin") ? "" : "disabled" %> />