Скрытые возможности ASP.NET [закрыто]

292

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

Больше информации: https://stackoverflow.com/faq


Всегда есть функции, которые были бы полезны в дополнительных сценариях, но по этой причине большинство людей их не знают. Я прошу об особенностях, которые обычно не преподаются в учебниках.

Какие из них вы знаете?

Vaibhav
источник
Хороший вопрос, хотелось бы проголосовать несколько раз!
Гэвин Миллер
1
Согласовано. Я люблю такие темы. В основе так много глубины, что вы иногда удивляетесь вещам, о которых никогда не знали.
Дин
Я узнал так много крутых новых трюков из ответов в этой теме - спасибо! :)
Максим Заславский
16
Вместо того, чтобы "Скрытые функции ...", эти вещи не должны называться "Малоизвестными функциями ...", потому что почти каждый ответ хорошо документирован в MSDN или где-либо еще, просто не широко известен или не используется.
Джон К
См. Meta.stackexchange.com/questions/56669/… , meta.stackexchange.com/questions/57226/… и соответствующие посты Meta для обсуждения уместности и закрытия.

Ответы:

335

Во время тестирования вы можете отправлять электронные письма в папку на вашем компьютере вместо SMTP-сервера. Поместите это в ваш web.config:

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
        </smtp>
    </mailSettings>
</system.net>
Джон Шиэн
источник
6
В самом деле? Я собирался установить поддельный SMTP-сервер, такой как Dumbster. Я спрятал драгоценный камень.
Эдуардо Молтени
2
Кто-нибудь знает, можете ли вы указать общий ресурс UNC для расположения каталога?
Марк Шерретта
32
А еще лучше, поместите это на свой dev box machine.config, чтобы вам не приходилось изменять web.config в каждом создаваемом приложении.
Макс Торо
Вы можете установить его так, чтобы он делал это только на локальном хосте? Таким образом, вам не нужно менять его каждый раз?
chobo2
Там нет настройки для этого. Вам придется управлять различиями в конфигурации, используя другие методы (проекты веб-развертывания, задачи сборки и т. Д.)
Джон Шихан,
210

Если вы поместите файл с именем app_offline.htm в корень каталога веб-приложения, ASP.NET 2.0+ закроет приложение и прекратит нормальную обработку любых новых входящих запросов для этого приложения, показывая только содержимое app_offline.htm. файл для всех новых запросов .

Это самый быстрый и простой способ отобразить уведомление «Сайт временно недоступен» при повторном развертывании (или откате) изменений на производственном сервере.

Кроме того, как указал marxidad , убедитесь, что у вас есть как минимум 512 байт содержимого в файле, чтобы IE6 правильно его отобразил.

Трой ДеМонбройн
источник
10
Не забудьте обходной путь для «дружеских» сообщений IE: tinyurl.com/app-offline-friendly
Марк Сидаде
1
Ой! Будьте осторожны при использовании этого с MOSS 2007. Он будет работать только для страниц, к которым был получен доступ после последнего перезапуска IIS. Итак, если вы добавите эту страницу в свой виртуальный корень wss, а затем попытаетесь открыть страницу, к которой ранее не обращались, вы получите 404.
Marc
1
@Marc - Получите этот совет от Скотта Гатри, если вы чувствуете себя щедрым, вы бы помогли многим разработчикам SharePoint избежать этого сценария, если бы прокомментировали статью Гу: weblogs.asp.net/scottgu/archive/2005/10/ 06 / 426755.aspx
Трой Демонбрюн
Кроме того, это также вызовет перезапуск домена приложения и закроет все открытые подключения к базе данных после завершения всех запросов.
Барт Verkoeijen
Здесь есть одна оговорка: IIS возвращает содержимое app_offline.htm с кодом состояния HTTP 404. Если поисковая система бродит и пытается проиндексировать ваш сайт, пока вы находитесь в автономном режиме, вы можете не оценить результаты. Но это прекрасно работает для моего частного корпоративного веб-приложения!
Ларри Сильверман
119
throw new HttpException(404, "Article not found");

Это будет обнаружено ASP.NET, который вернет страницу customErrors. Об этом узнал в недавнем посте «Совет дня .NET»

Джон Шиэн
источник
Некоторые разработчики могут утверждать, что лучше обернуть вещи вручную в HttpContext.Response, а не создавать исключение, которое является довольно дорогой операцией в книгах .NET.
Любос Хаско
Разве это не плохая форма? Вы показываете ошибку 404, в то время как вы хотите отобразить ошибку / исключение.
Донни Томас
1
Я могу вспомнить один случай: если кто-то злонамеренно портит параметры и помещает в них что-то недопустимое, вы, вероятно, захотите универсальный 404, а не конкретную ошибку.
Джон Шиэн
3
Проголосовал чисто потому, что теперь я знаю сайт .NET Tip of the Day.
Кон
это работает только когда вы добавляете его в httpModule или httpHandler
Халед Мусайед
75

Вот самый лучший. Добавьте это в ваш web.config для НАМНОГО более быстрой компиляции. Это пост 3.5SP1 через этот QFE .

<compilation optimizeCompilations="true">

Краткое резюме: мы представляем новый переключатель optimizeCompilations в ASP.NET, который может значительно повысить скорость компиляции в некоторых сценариях. Есть некоторые уловы, так что читайте дальше для более подробной информации. Этот переключатель в настоящее время доступен в качестве QFE для 3.5SP1 и станет частью VS 2010.

Система компиляции ASP.NET использует очень консервативный подход, который приводит к удалению любой предыдущей работы, которую она выполняла каждый раз, когда изменяется файл «верхнего уровня». Файлы верхнего уровня включают в себя что угодно в bin и App_Code, а также в global.asax. Хотя это отлично работает для небольших приложений, оно становится практически непригодным для очень больших приложений. Например, клиент столкнулся со случаем, когда потребовалось 10 минут для обновления страницы после внесения каких-либо изменений в сборку «bin».

Чтобы облегчить боль, мы добавили «оптимизированный» режим компиляции, который использует гораздо менее консервативный подход к перекомпиляции.

Через здесь :

Скотт Хансельман
источник
6
Это «по умолчанию» с VS 2010 или я все еще должен попробовать?
M4N
73
  • HttpContext.Current всегда предоставит вам доступ к запросу / ответу и т. Д. Текущего контекста, даже если у вас нет доступа к свойствам страницы (например, из слабо связанного вспомогательного класса).

  • Вы можете продолжить выполнение кода на той же странице после перенаправления пользователя на другую, вызвав Response.Redirect ( url , false )

  • Вам не нужны файлы .ASPX, если все, что вам нужно, это скомпилированная страница (или любой IHttpHandler ). Просто установите путь и методы HTTP, чтобы они указывали на класс в <httpHandlers>элементе в файле web.config.

  • Объект Page можно получить из файла .ASPX программным путем, вызвав PageParser.GetCompiledPageInstance (virtualPath, aspxFileName, Context).

Марк Сидаде
источник
Об Response.Redirect (url, false) - это то, на что я надеялся довольно долгое время ... Я не знаю, как я это пропустил, но, чем ххх
Subliminal Hash
1
Может кто-нибудь объяснить, что вы будете делать с этим? Я знаю, что это имеет какое-то значение, но я не могу понять, почему ...
Дин
5
Если вы хотите перенаправить пользователя на другой адрес, но при этом необходимо выполнить некоторую внутреннюю обработку (например, запрос на создание отчета, который перенаправляет на страницу состояния создания отчета, когда он продолжает генерировать отчет в фоновом режиме)
Mark Cidade
Может кто-нибудь объяснить полезную ситуацию для PageParser.GetCompiledPageInstance (..)? Документы говорят, что он предназначен для использования в инфраструктуре - он возвращает тип IHttpHandler, поэтому я не понимаю, как его можно использовать на практике.
Джон К
@jdk: я использовал его в прошлом при переопределении обработчика по умолчанию для запросов * .aspx, чтобы я мог использовать динамические объекты IHttpHandler в памяти, а также использовать GetCompiledPageInstance () для физических файлов * .aspx.
Марк Сидаде
70

Режим розничной торговли на уровне machine.config:

<configuration>
  <system.web>
    <deployment retail="true"/>
  </system.web>
</configuration>

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

Troy Hunt
источник
1
Я иногда забываю перед публикацией изменить отладку компиляции на false, что отрицательно влияет на производительность. Нет проблем больше!
Рой Тинкер
59

Включение intellisense для MasterPages на страницах контента
Я уверен, что это очень мало известный взлом

Большую часть времени вы должны использовать метод FindControl и отбрасываемой элементы управления в главной странице со страниц контента , когда вы хотите использовать их, MasterType директива позволит IntelliSense в визуальной студии , как только вы к этому

просто добавьте еще одну директиву на страницу

<%@ MasterType VirtualPath="~/Masters/MyMainMasterPage.master" %>

Если вы не хотите использовать виртуальный путь и вместо него использовать имя класса,

<%@ MasterType TypeName="MyMainMasterPage" %>

Получить полную статью здесь

Binoj Antony
источник
Использование FindControl иногда может быть беспокойным, спасибо за этот отличный совет!
Александр Бризебуа
4
Использование этого может привести к неожиданному поведению. См stackoverflow.com/questions/1998931/...
citronas
Лично я думаю, что функция должна быть оставлена ​​неизвестной людям, она связывает страницу с главной страницей. Если вы в конечном итоге используете свойства / методы мастер-страницы, а затем меняете мастер-страницу, то в итоге вы получите кошмар обслуживания.
Филл
@Phil: иногда это необходимо, и иметь статически типизированный доступ к главной странице гораздо лучше, чем подход FindControl. По крайней мере, вы получаете сообщение компилятора и можете быстро это исправить.
Durden81
58

HttpContext.Items как инструмент кэширования на уровне запросов

Джон Шиэн
источник
2
Это также будет моей целью, я использую это во вложенных элементах управления для передачи / получения информации уровня запроса. Я также использую это в MVC для хранения списка js-файлов для добавления, основанного на частичных представлениях.
Tracker1
1
Я использую это, когда использую маршрутизацию asp.net для передачи параметров, извлеченных из URL-адресов, на мои страницы. (не с MVC) отлично подходит для переписывания URL и довольно гибок.
Александр Бризебуа
Хммм, просто подумал о том, где я мог бы использовать это вместо сессии - та!
Майк Кингскотт
52

В моей голове выделяются две вещи:

1) Вы можете включать и выключать трассировку из кода:

#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, и наоборот, но вам нужно помнить, чтобы проверить свои элементы управления на наличие нулей.

Radu094
источник
Я бы проголосовал за это, но не хватило голосов. Я попытаюсь вспомнить, чтобы вернуться и проголосовать за это. Я не знал, что у нас может быть один и тот же файл Code Behind для нескольких страниц. Не уверен, как это будет работать.
Вайбхав
5
Кто-нибудь еще думает, что это риск для безопасности, позволяющий вам активировать трассировку по URL? (# 1) Я не собираюсь понижать этот вопрос, но важно понимать риск там.
Кевин Гофф
5
Абсолютно, вы действительно должны поместить этот код в блок
#ifdef
Замечательные комментарии, указывающие на аспект безопасности.
Вайбхав
2
Почему активировать трассировку по URL-адресу опасно? Как это может быть использовано, чтобы навредить мне?
Камарей
48

Ты можешь использовать:

 Request.Params[Control.UniqueId] 

Чтобы получить значение элемента управления, ДО просмотра состояния инициализируется (Control.Text и т. Д. Будет пустым в этой точке).

Это полезно для кода в Init.

FlySwat
источник
Инициализация ViewState не обрабатывается с помощью Request.Params. Используйте его ДО поднятия метода LoadPostData элемента управления, реализованного IPostBackDataHandler.
Чаплак
46

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>
Дэн Диплом
источник
45

Убедитесь, что клиент все еще подключен, прежде чем запускать долгосрочную задачу:

if (this.Response.IsClientConnected)
{
  // long-running task
}
RickNZ
источник
44

Одна малоизвестная и редко используемая функция 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>
CraigTP
источник
Это было бы очень запутанным для других разработчиков в вашей команде
Aykut Akıncı
1
@Aykut - Действительно, это может быть, поэтому я заявляю, что его полезность довольно узка, однако, когда требуется, это очень удобно Кроме того, я хотел бы убедиться, что любое использование Tag Mapping было очень четко задокументировано, чтобы избежать путаницы и двусмысленности.
CraigTP
43

HttpModules . Архитектура безумно элегантная. Может быть, не скрытая особенность, но круто тем не менее.

Аллен Лалонд
источник
3
HttpModules - это то, что является продвинутым, но я бы не назвал это редким или менее используемым (или назовите меня наивным). Но да, я люблю архитектуру.
Вайбхав
+1, потому что многие опытные разработчики могут знать о HttpModules, но не до конца понимают свою связь с запросами. (То же самое и с HttpHandlers)
Джон Бубриски
34

Вы можете использовать комментарии ASP.NET на странице .aspx, чтобы закомментировать полные части страницы, включая элементы управления сервером. И закомментированное содержимое никогда не будет отправлено клиенту.

<%--
    <div>
        <asp:Button runat="server" id="btnOne"/>
    </div>
--%>
Крис Питчманн
источник
5
Есть люди, которые действительно не знают, что есть комментарии?
Джо Филлипс
7
Мне нравится, когда вы найдете половину страницы aspx в <! - comments ...
Bryan Rehbein
Это довольно голая особенность ASP.NET
rafek
34

Построитель выражений кода

Образец разметки:

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);
    }
} 
andleer
источник
1
что вы имеете в виду с "и другие" в названии?
Халед Мусаид
Ну, я думаю, я никогда не добрался до других.
andleer
2
+1, действительно классная функция ... Это на самом деле очень похоже на расширения разметки WPF
Томас Левеск
разве это не то же самое, что использование <%= /*code*/ %>?
Bevacqua
33

Использование типа файла 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; }
        }
    }
}
оборота Биной ​​Антоний
источник
5
Стоит отметить, что вы должны добавить IRequiresSessionState или IReadOnlySessionState, если вам это нужно, иначе его там не будет.
Tracker1
3
Также стоит отметить, что вы можете указать настройку обработчика в файле web.config, чтобы вам не нужно было размещать физический файл Ashx. Или вы можете программно зарегистрировать обработчик в вашем приложении при запуске в глобальном asax.
Филл
27

Настройка свойств управления сервером на основе целевого браузера и многое другое .

<asp:Label runat="server" ID="labelText" 
    ie:Text="This is IE text" 
    mozilla:Text="This is Firefox text" 
    Text="This is general text" 
/>

Это своего рода застало меня врасплох.

Омер ван Клоэтен
источник
1
+1. Можете ли вы опубликовать пример короткого кода в строке. Я думаю, что это вызовет больше внимания и голосов. Я хочу, чтобы этот пошел вверх.
Джон К
26

Я работал над приложением 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 завершается неудачно, и создается исключение.

Craig McKeachie
источник
2
Также не забудьте покинуть базу. OnInit (e); для функции Page_Init (), чтобы сделать свою работу.
Друид
Я думаю, что этот трюк может потерпеть неудачу, если реальный пользователь не принимает куки или если у sessionid есть тайм-аут.
Аристос
1
Вам не нужно, base.OnInit(e);если вы используете AutoEventWireup="true"для страницы.
Адам Нофсингер
1
Друид: Он не переопределяет OnInit (в этом случае base.OnInit (e) будет необходим).
crdx
Использование идентификатора сеанса для ViewStateUserKey работает только после фактического начала сеанса. Это также означает, что время истечения времени ожидания может истечь. В тех случаях, когда эти проблемы вызывают беспокойство, вы можете рассмотреть возможность использования чего-то более надежного, например, IP-адреса пользователя.
RickNZ
25

HttpContext.Current.IsDebuggingEnabled

Это отлично подходит для определения того, какие скрипты выводить (минимальные или полные версии) или что-то еще, что вы можете захотеть в dev, но не использовать.

Джон Шиэн
источник
Я согласен с Яном, но иногда может быть интересно иметь приложение, которое знает о своем состоянии выполнения Debug / Release.
Александр Бризебуа
20

Включено в ASP.NET 3.5 SP1:

  • customErrors теперь поддерживает атрибут «redirectMode» со значением «ResponseRewrite». Показывает страницу ошибки без изменения URL.
  • Тег формы теперь распознает атрибут действия. Отлично подходит, когда вы используете переписывание URL
Джон Шиэн
источник
20

Свойство DefaultButton в Панелях .

Он устанавливает кнопку по умолчанию для конкретной панели.

MRG
источник
1
Внимание, не работает на всех видах кнопок, например, LinkButtons!
Кову
19

Использование 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, и просто хотите, чтобы они могли изменять только несколько настроек.

ссылка: http://weblogs.asp.net/fmarguerie/archive/2007/04/26/using-configsource-to-split-configuration-files.aspx

Райан Шрипат
источник
1
Это также работает с любым типом проекта .net, например, с приложением Desktop. конфиги
Золтан Верес
17

Атрибут MaintainScrollPositionOnPostback в директиве Page. Он используется для поддержания позиции прокрутки страницы aspx в постбэках.

MRG
источник
1
Комментарий будет полезен для улучшения ответа.
MRG
16

По умолчанию любое содержимое между тегами для пользовательского элемента управления добавляется в качестве дочернего элемента управления. Это может быть перехвачено в переопределении 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>
Марк Сидаде
источник
13

Если у вас есть ASP.NET, генерирующий канал RSS, он иногда помещает дополнительную строку вверху страницы. Это не будет проверяться с обычными валидаторами RSS. Вы можете обойти это, поместив директиву страницы <@Page>внизу страницы.

Кевин Гофф
источник
7
Не лучше ли использовать обработчик .ASHX для создания RSS-каналов?
Дэн Диплом
Я думаю, это зависит от сложности проекта. Не каждый обладает способностью или навыками создавать и компилировать обработчики. На странице asp.net работает достаточно хорошо для этого
Кевин Гофф
1
И вы можете использовать что-то вроде <asp: Repeater> для генерации RSS-элементов и выполнения других трюков (таких как использование LogInView для удаления некоторых элементов), что намного лучше, чем написание строк из ASHX IMO
chakrit
LinqToXml + ASHX - это путь!
Карлос Муньос
Это полезно для гораздо большего, чем генерация RSS-каналов. IIRC, HTML5 должен иметь тег <! Doctype html> в первой строке вверху для правильной проверки.
Рой Тинкер
12

Перед добавлением маршрутов в ASP.NET v3.5 вы могли создавать собственные понятные URL-адреса, просто написав HTTPModule для и переписав запрос в начале конвейера страницы (например, событие BeginRequest).

URL- адреса, такие как http: // имя_сервера / page / Param1 / SomeParams1 / Param2 / SomeParams2, будут отображаться на другой странице, как показано ниже (часто с использованием регулярных выражений).

HttpContext.RewritePath("PageHandler.aspx?Param1=SomeParms1&Param2=SomeParams2");

DotNetNuke имеет действительно хороший HttpModule, который делает это для своих дружественных URL. Все еще полезно для машин, где вы не можете развернуть .NET v3.5.

Тайлер
источник
Это требует сопоставления всех запросов IIS к ASP.NET
Джон Шихан,
Или просто обработчик ошибок 404.
FlySwat