Этот вопрос существует, потому что он историческое значение, но это не считается хорошим, по теме вопросом для этого сайта , поэтому, пожалуйста, не используйте его в качестве доказательства того, что вы можете задать аналогичные вопросы здесь.
Дополнительная информация: https://stackoverflow.com/faq
Есть всегда функции, которые были бы полезны в сценариях, но по этой причине большинство людей их не знают. Я прошу об особенностях, которые обычно не преподаются в учебниках.
Что вы знаете?
Во время тестирования вы можете отправлять сообщения электронной почты в папку на своем компьютере вместо SMTP-сервера. Поместите это в свой web.config:
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
</smtp>
</mailSettings>
</system.net>
Если вы поместите файл с именем app_offline.htm в корне каталога веб-приложений ASP.NET 2.0+ отключит приложение и прекратит нормальную обработку любых новых входящих запросов для этого приложения, показывая только содержимое файла app_offline.htm для всех новых запросов.
Это самый быстрый и простой способ отобразить уведомление о недоступности "Site Temporarily Unavailable" при повторном развертывании (или откате) изменений на сервере Production.
Кроме того, как указано marxidad, убедитесь, что в файле содержится не менее 512 байт содержимого, поэтому IE6 будет отображать его правильно.
throw new HttpException(404, "Article not found");
Это поймает ASP.NET, который вернет страницу customErrors. Узнал об этом в недавнем .NET-сообщении дня дня
Здесь лучший. Добавьте это в свой web.config для более быстрой компиляции MUCH. Это сообщение 3.5SP1 через этот QFE.
<compilation optimizeCompilations="true">
Краткое резюме: мы представляем новый optimizeCompilations включается ASP.NET, который может значительно улучшить скорость компиляции в некоторых сценариях. Есть некоторые уловы, поэтому читайте дальше более подробно. Этот переключатель в настоящее время доступен как QFE для 3.5SP1, и будет частью VS 2010.
Система компиляции ASP.NET принимает очень консервативный подход, который заставляет его стереть все предыдущие работа, которую он сделал в любое время файл. "Файлы верхнего уровня включить что-нибудь в bin и App_Code, а также global.asax. Хотя это отлично работает для небольших приложений, он становится почти неприменимо для очень больших приложений. Например. клиент столкнулся с случай, когда он занимал 10 минут до обновить страницу после внесения любых изменений к сборке бункеров.
Чтобы облегчить боль, мы добавили Оптимизированный режим компиляции, который берет гораздо менее консервативный подход к перекомпиляции.
Через здесь:
Режим розничной продажи на уровне machine.config:
<configuration>
<system.web>
<deployment retail="true"/>
</system.web>
</configuration>
Переопределяет настройки web.config, чтобы обеспечить отладку false, включает пользовательские ошибки и отключает трассировку. Больше не забывайте изменять атрибуты перед публикацией - просто оставьте их настроенными для среды разработки или тестирования и обновите настройки розничной торговли.
HttpContext.Current всегда будет предоставлять вам доступ к текущему контексту Request/Response/etc., даже если у вас нет доступа к свойствам страницы (например, от слабого -связанный вспомогательный класс).
Вы можете продолжить выполнение кода на той же странице после перенаправления пользователя на другой, вызывая Response.Redirect(url, false )
Вам не нужны файлы .ASPX, если вы хотите, это скомпилированная страница (или любая IHttpHandler). Просто установите путь и методы HTTP, чтобы указать класс в <httpHandlers>
element в файле web.config.
Объект Страница может быть извлечен из файла .ASPX программным путем, вызывая PageParser.GetCompiledPageInstance(virtualPath, aspxFileName, Context)
Включение intellisense для мастер-страниц на страницах контента
Я уверен, что это очень мало известный хак.
В большинстве случаев вам нужно использовать метод findcontrol и отбрасывать элементы управления на главной странице с страниц контента, когда вы хотите их использовать, директива MasterType позволит использовать intellisense в визуальной студии, как только вы к этому
просто добавьте еще одну директиву на страницу
<%@ MasterType VirtualPath="~/Masters/MyMainMasterPage.master" %>
Если вы не хотите использовать виртуальный путь и вместо него используете имя класса,
<%@ MasterType TypeName="MyMainMasterPage" %>
Получить полную статью здесь
HttpContext.Items как инструмент кэширования на уровне запросов
Вы можете использовать:
Request.Params[Control.UniqueId]
Чтобы получить значение элемента управления, перед инициализацией viewState (Control.Text и т.д. в этой точке будет пустым).
Это полезно для кода в Init.
В моей голове выделяются две вещи:
1) Вы можете включить и отключить Trace из кода:
#ifdef DEBUG
if (Context.Request.QueryString["DoTrace"] == "true")
{
Trace.IsEnabled = true;
Trace.Write("Application:TraceStarted");
}
#endif
2) Вы можете создавать несколько страниц .aspx, используя только один общий файл "code-behind".
Создайте один файл класса .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, и наоборот, но вам нужно помнить, что ваши элементы управления имеют значения null.
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>
Убедитесь, что клиент все еще подключен, перед запуском долговременной задачи:
if (this.Response.IsClientConnected)
{
// long-running task
}
HttpModules. Архитектура безумно элегантна. Возможно, это не скрытая функция, но, тем не менее, прохладно.
Одна малоизвестная и редко используемая функция 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>
Конструктор выражений кода
Пример разметки:
Text = '<%$ Code: GetText() %>'
Text = '<%$ Code: MyStaticClass.MyStaticProperty %>'
Text = '<%$ Code: DateTime.Now.ToShortDateString() %>'
MaxLenth = '<%$ Code: 30 + 40 %>'
Настоящая красота конструктора выражений кода заключается в том, что вы можете использовать привязку данных, подобную выражениям, в ситуациях, не связанных с привязкой данных. Вы также можете создавать другие Expression Builders, которые выполняют другие функции.
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; }
}
}
}
Вы можете использовать комментарии ASP.NET на странице .aspx, чтобы прокомментировать полные части страницы, включая серверные элементы управления. И содержимое, которое закомментировано, никогда не будет отправлено клиенту.
<%--
<div>
<asp:Button runat="server" id="btnOne"/>
</div>
--%>
Настройка свойств управления сервером на основе целевого браузера и more.
<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
Рассмотрите возможность использования Page.ViewStateUserKey для борьбы с атаками одним нажатием. Если вы аутентифицируете своих абонентов и используете ViewState, установите свойство Page.ViewStateUserKey в обработчике событий Page_Init, чтобы предотвратить атаки одним нажатием.
void Page_Init (object sender, EventArgs e) {
ViewStateUserKey = Session.SessionID;
}
Установите для свойства значение, которое, как вам известно, уникально для каждого пользователя, например идентификатор сеанса, имя пользователя или идентификатор пользователя.
Атака одним нажатием происходит, когда злоумышленник создает веб-страницу (.htm или .aspx), которая содержит поле скрытой формы с именем __VIEWSTATE, которое уже заполнено данными ViewState. ViewState может быть сгенерирован на странице, которую ранее создавал злоумышленник, такой как страница корзины со 100 элементами. Злоумышленник заманивает ничего не подозревающего пользователя на просмотр страницы, а затем злоумышленник вызывает отправку страницы на сервер, на котором действителен ViewState. Сервер не знает, что ViewState произошел от злоумышленника. Проверка ViewState и HMAC не противодействуют этой атаке, потому что ViewState действительна и страница выполняется в контексте безопасности пользователя.
Установив свойство ViewStateUserKey, когда злоумышленник просматривает страницу для создания ViewState, свойство инициализируется его именем. Когда законный пользователь отправляет страницу на сервер, он инициализируется именем злоумышленника. В результате проверка ViewState HMAC завершается с ошибкой и генерируется исключение.
HttpContext.Current.IsDebuggingEnabled
Это отлично подходит для определения того, какие сценарии для вывода (минимальные или полные версии) или что-то еще, что вам может понадобиться в dev, но не вживую.
Включено в ASP.NET 3.5 SP1:
DefaultButton свойство в панелях.
Он устанавливает кнопку по умолчанию для конкретной панели.
Использование configSource для разделения файлов конфигурации.
Вы можете использовать атрибут configSource в файле web.config для перемещения элементов конфигурации в другие файлы .config, например, вместо:
<appSettings>
<add key="webServiceURL" value="https://some/ws.url" />
<!-- some more keys -->
</appSettings>
... вы можете иметь весь раздел appSettings, хранящийся в другом файле конфигурации. Здесь новый web.config
:
<appSettings configSource="myAppSettings.config" />
Файл myAppSettings.config
:
<appSettings>
<add key="webServiceURL" value="https://some/ws.url" />
<!-- some more keys -->
</appSettings>
Это очень полезно для сценариев, в которых вы развертываете приложение для клиента, и не хотите, чтобы они мешали самому файлу web.config и просто хотели, чтобы они могли изменять только несколько настроек.
У ScottGu есть куча трюков в http://weblogs.asp.net/scottgu/archive/2006/04/03/441787.aspx
MaintainScrollPositionOnPostback атрибут в директиве страницы. Он используется для поддержания положения прокрутки страницы aspx через обратную передачу.
По умолчанию любое содержимое между тегами для настраиваемого элемента управления добавляется в качестве дочернего элемента управления. Это можно перехватить в переопределении 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>
HttpContext.IsCustomErrorEnabled - замечательная функция. Я нашел ее полезной не один раз. Ниже приведена короткая публикация.
Если у вас есть ASP.NET, генерирующий RSS-канал, он иногда помещает дополнительную строку вверху страницы. Это не будет проверяться с помощью обычных валидаторов RSS. Вы можете обойти это, разместив директиву страницы <@Page>
внизу страницы.
Моя команда использует это как хак:
WebRequest myRequest = WebRequest.Create("http://www.google.com");
WebResponse myResponse = myRequest.GetResponse();
StreamReader sr = new StreamReader(myResponse.GetResponseStream());
// here page response loaded into a string for further use
String thisReturn = sr.ReadToEnd().Trim();
Он загружает ответ веб-страницы в виде строки. Вы также можете отправить параметры сообщения.
Мы используем его вместо ASCX/AJAX/WebServices, когда нам нужно что-то дешевое и быстрое. В принципе, это быстрый способ доступа к веб-доступному контенту на серверах. Фактически, мы только что назвали его "Redneck Web Service" вчера.
До добавления добавленных маршрутов ASP.NET v3.5 вы могли бы создать свои собственные дружественные URL-адреса, просто написав HTTPModule и перезапишите запрос на ранней стадии конвейера страниц (например, событие BeginRequest).
Вызывается как http://servername/page/Param1/SomeParams1/Param2/SomeParams2 будет отображаться на другой странице, как показано ниже (часто с использованием регулярных выражений).
HttpContext.RewritePath("PageHandler.aspx?Param1=SomeParms1&Param2=SomeParams2");
DotNetNuke имеет действительно хороший HttpModule, который делает это для своих дружественных URL-адресов. По-прежнему полезно для машин, где вы не можете установить .NET v3.5.
Знаете ли вы, что можно запускать ASP.Net вне IIS или Visual Studio?
Вся среда исполнения упакована и готова к размещению в любом процессе, который хочет попробовать. Используя классы ApplicationHost
, HttpRuntime
и HttpApplication
, вы также можете перемалывать эти .aspx-страницы и получать от них блестящий вывод HTML.
HostingClass host = ApplicationHost.CreateApplicationHost(typeof(HostingClass),
"/virtualpath", "physicalPath");
host.ProcessPage(urlToAspxFile);
И ваш класс хостинга:
public class HostingClass : MarshalByRefObject
{
public void ProcessPage(string url)
{
using (StreamWriter sw = new StreamWriter("C:\temp.html"))
{
SimpleWorkerRequest worker = new SimpleWorkerRequest(url, null, sw);
HttpRuntime.ProcessRequest(worker);
}
// Ta-dah! C:\temp.html has some html for you.
}
}
CompilationMode = "Никогда" - это функция, которая может иметь решающее значение на некоторых сайтах ASP.NET.
Если у вас есть приложение ASP.NET, где ASPX-страницы часто генерируются и обновляются с помощью CMS или другой системы публикации, важно использовать CompilationMode = "Never".
Без этой настройки в результате изменения файла ASPX будут выполняться повторные компиляции, которые быстро заставят ваш appdomain перезагрузиться. Это может уничтожить состояние сеанса и кеш httpruntime, не говоря уже о задержке, вызванной перекомпиляцией.
(Чтобы предотвратить перекомпиляцию, вы можете увеличить параметр numRecompilesBeforeAppRestart, но это не идеально, поскольку оно потребляет больше памяти.)
Одно из предостережений для этой функции заключается в том, что страницы ASPX не могут содержать никаких кодовых блоков. Чтобы обойти это, можно поместить код в пользовательские элементы управления и/или базовые классы.
Эта функция в основном не имеет значения в случаях, когда страницы ASPX часто не меняются.
мне пришла в голову одна особенность, иногда вам нужно будет скрыть часть вашей страницы от людей. вы можете сделать это с помощью javascript или с помощью этого простого кода:
if (Request.Browser.Crawler){
HideArticleComments();
Действительный синтаксис, который VS задыхается:
<input type="checkbox" name="roles" value='<%# Eval("Name") %>'
<%# ((bool) Eval("InRole")) ? "checked" : "" %>
<%# ViewData.Model.IsInRole("Admin") ? "" : "disabled" %> />
Аналогично решению optimizeCompilations = "true", еще один способ ускорить время ожидания между сборками (очень хорошо, особенно если вы работаете с большим проектом): создайте привод на основе ram (например, используя RamDisk) и измените ваши временные файлы ASP.NET по умолчанию на этот накопитель на основе памяти.
Полная информация о том, как это сделать, находится в моем блоге: http://www.wagnerdanda.me/2009/11/speeding-up-build-times-in-asp-net-with-ramdisk/
В основном вы сначала настраиваете RamDisk (опять же, в моем блоге есть ссылка на бесплатный ramdisk), а затем вы меняете свой web.config в соответствии с этим:
<system.web>
....
<compilation debug="true" tempDirectory="R:\ASP_NET_TempFiles\">
....
</compilation>
....
</system.web>
Это значительно увеличивает время разработки, вам просто нужно инвестировать в память для компьютера:)
Счастливое программирование!
Вагнер Данда
Указывает, поступает ли текущий запрос с локального компьютера или нет.
if( Request.IsLocal )
{
LoadLocalAdminMailSettings();
}
else
{
LoadServerAdminMailSettings();
}
Я думал, что это было аккуратно, когда я сбрасывал xmlDocument() в метку и отображал ее с помощью xsl.
По умолчанию любая страница веб-формы наследуется от класса System.Web.UI.Page
. Что делать, если вы хотите, чтобы ваши страницы наследовались от пользовательского базового класса, который наследуется от System.Web.UI.Page
?
Есть способ ограничить любую страницу наследованием от вашего собственного базового класса. Просто добавьте новую строку на web.config
:
<system.web>
<pages pageBaseType="MyBasePageClass" />
</system.web>
Внимание: это допустимо только в том случае, если ваш класс является автономным. Я имею в виду класс, который не имеет кода, который выглядит как <%@ Page Language="C#" AutoEventWireup="true" %>
Метод EnsureChildControls: он проверяет дочерние элементы управления, если они инициированы. Если дочерние элементы управления не инициируются, он вызывает метод CreateChildControls.
Прикрепите класс, расположенный в папке App_Code, к вашему файлу глобального приложения.
ASP.NET 2.0 - Global.asax - Код за файлом.
Это также работает в Visual Studio 2008.
Многие люди упомянули, как оптимизировать ваш код при перекомпиляции. Недавно я обнаружил, что могу выполнить большую часть моей разработки (на основе кода) на странице aspx и полностью пропустить шаг сборки. Просто сохраните файл и обновите страницу. Все, что вам нужно сделать, это обернуть свой код в следующий тег:
<script runat="server">
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Response.Write("Look Ma', I didn't even had to build!")
End Sub
</script>
Как только вы закончите, просто переместите все на код, поработайте, протестируйте все, что работает, и вуаля!
-D
Вы можете найти любой элемент управления, используя свойство UniqueID:
Label label = (Label)Page.FindControl("UserControl1$Label1");
'file' атрибут элемента appsettings в web.config.
Задает относительный путь к внешнему файлу, который содержит настройки конфигурации пользовательского приложения.
Если у вас есть несколько настроек приложения из многих, которые необходимо изменить в разных средах (prod), это отличный выбор.
Поскольку любые изменения в файле Web.config заставляют приложение перезагружаться, использование отдельного файла позволяет пользователям изменять значения, находящиеся в разделе appSettings, не приводя к перезапуску приложения. Содержимое отдельного файла объединено с секцией appSettings в файле Web.config.
Если вы используете веб-службы вместо служб WCF, вы все равно можете использовать стандартное членство .Net для обеспечения аутентификации и поведения сеанса входа в систему на набор веб-сервисов, аналогично тому, как вы защищаете веб-сайт с аутентификацией форм членства и без необходимости в специальном сеансе и/или реализации мыльных заголовков, просто вызывая System.Web.Security.FormsAuthentication.SetAuthCookie(имя_пользователя, false) [после вызова Membership.ValidateUser(имя_пользователя, пароль), конечно] для создания файла cookie в ответе, как если бы пользователь вошел в систему через веб-форму. Затем вы можете получить этот cookie аутентификации с помощью Response.Cookies []. Значение и вернуть его в виде строки пользователю который может использоваться для аутентификации пользователя в последующих вызовах путем повторного создания файла cookie в Application_BeginRequest путем извлечения cookie метод call param из Request.InputStream и повторное создание файла cookie auth до того, как членство аутентифицирует запрос таким образом, членский провайдер получает обманом и будет знать, что запрос аутентифицирован и обеспечивает соблюдение всех его правил.
Пример подписи веб-метода для возврата этого файла cookie пользователю: string Login (имя_пользователя, пароль)
Образец последующего вызова веб-метода будет следующим: string DoSomething (string authcookie, string methodParam1, int methodParam2 и т.д. и т.д.), где вам нужно извлечь параметр authcookie (который является значением, полученным из метода Login), из Request.InputStreamis
Это также имитирует сеанс входа в систему и вызывает FormsAuthentication.SignOut в веб-методе, таком как этот выход (authcookie) заставьте пользователя снова войти в систему.
Свойство ClientScript на объекте страницы.
Переменные приложения могут использоваться с веб-приложением для обмена данными по всему приложению. Он инициализируется в файле Global.asax и используется через страницы в этом веб-приложении всем пользователем, независимо от создаваемого ими сеанса.
Шаблоны пользовательских элементов управления. Как только вы знаете, как они работают, вы увидите всевозможные возможности. Здесь простейшая реализация:
TemplatedControl.ascx
Замечательно, что здесь используется простой и знакомый блок управления пользовательским контентом и возможность компоновки различных частей вашего интерфейса с помощью HTML и некоторых заполнителей.
<%@ Control Language="C#" CodeFile="TemplatedControl.ascx.cs" Inherits="TemplatedControl" %>
<div class="header">
<asp:PlaceHolder ID="HeaderPlaceHolder" runat="server" />
</div>
<div class="body">
<asp:PlaceHolder ID="BodyPlaceHolder" runat="server" />
</div>
TemplatedControl.ascx.cs
"Секрет" здесь использует общедоступные свойства типа ITemplate
и знает о [ParseChildren]
и [PersistenceMode]
.
using System.Web.UI;
[ParseChildren(true)]
public partial class TemplatedControl : System.Web.UI.UserControl
{
[PersistenceMode(PersistenceMode.InnerProperty)]
public ITemplate Header { get; set; }
[PersistenceMode(PersistenceMode.InnerProperty)]
public ITemplate Body { get; set; }
void Page_Init()
{
if (Header != null)
Header.InstantiateIn(HeaderPlaceHolder);
if (Body != null)
Body.InstantiateIn(BodyPlaceHolder);
}
}
Default.aspx
<%@ Register TagPrefix="uc" TagName="TemplatedControl" Src="TemplatedControl.ascx" %>
<uc:TemplatedControl runat="server">
<Header>Lorem ipsum</Header>
<Body>
// You can add literal text, HTML and server controls to the templates
<p>Hello <asp:Label runat="server" Text="world" />!</p>
</Body>
</uc:TemplatedControl>
Вы даже получите IntelliSense для внутренних свойств шаблона. Поэтому, если вы работаете в команде, вы можете быстро создать многоразовый пользовательский интерфейс, чтобы достичь той же способности, что и ваша команда уже пользуется встроенными элементами управления ASP.NET.
пример MSDN (та же самая ссылка, что и начало) добавляет некоторые дополнительные элементы управления и контейнер именования, но это становится необходимым, если вы хотите поддержка элементов типа "повторитель".
Можно упаковать страницы ASPX в библиотеку (DLL) и обслуживать их с помощью механизма ASP.NET.
Вам нужно будет реализовать свой собственный VirtualPathProvider, который будет загружаться через определенные DLL файлы Relfection, или вы можете включить имя DLL в своем путь к файлу. Это зависит от вас.
Магия происходит при переопределении метода VirtualFile.Open, где вы возвращаете ASPX файл в качестве ресурса из класса Assembly: Assembly.GetManifestResourceStream. Механизм ASP.NET обрабатывает ресурс, поскольку он обслуживается через VirtualPathProvider.
Это позволяет подключаемым страницам или, как и я, использовать его для включения HttpHandler с элементом управления.
Одна из вещей, которые я использую для работы с несколькими версиями VB, VBScript и VB.NET, заключается в преобразовании значений набора записей в строку, чтобы исключить множественные тесты для NULL или пробела. т.е. Trim(rsData("FieldName").Value & " ")
В случае целого числа это будет: CLng("0" & Trim(rsData("FieldName").Value & " "))
После того, как веб-сайт был опубликован и развернут на производственном сервере, если нам нужно сделать некоторые изменения на кнопке click button на сервере. Мы можем переопределить существующее событие клика, используя ключевое слово new
на самой странице aspx.
Пример
Код за методом
Protected void button_click(sender object, e System.EventArgs)
{
Response.Write("Look Ma', I Am code behind code!")
}
Метод OverRead:
<script runat="server">
Protected void new button_click(sender object, e System.EventArgs)
{
Response.Write("Look Ma', I am overrided method!")
}
</script
Таким образом, мы можем легко исправить ошибки производственного сервера без перераспределения.
new
ключевого слова.
Это кажется огромным, неопределенным вопросом... Но я буду использовать Reflection, поскольку это позволило мне сделать некоторые невероятно мощные вещи, такие как подключаемые DAL и т.д.