Приховані особливості ASP.NET [закрито]


292

Це питання існує тому, що воно має історичне значення, але воно не вважається хорошим актуальним питанням для цього веб-сайту, тому, будь ласка, не використовуйте його як доказ того, що ви можете задавати подібні запитання тут.

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


Завжди є функції, які були б корисні у сценаріях бахроми, але саме тому більшість людей їх не знає. Я прошу особливості, які зазвичай не викладаються підручниками.

Які ви знаєте?


Добре запитання, я хотів би проголосувати кілька разів!
Гевін Міллер

1
Домовились. Я люблю такі теми. Рамка настільки велика, що іноді ви дивуєтесь речам, про які ніколи не знали.
Дін

Я вивчаю так багато класних нових трюків з відповідей у ​​цій темі - дякую! :)
Максим Заславський

16
Замість того, щоб "Приховані особливості .." не слід називати ці речі "Маловідомими рисами ..", оскільки більшість кожної відповіді добре зафіксовані в MSDN або в інших місцях, просто не відомі або використовувані.
Джон К

Див. Meta.stackexchange.com/questions/56669/… , meta.stackexchange.com/questions/57226/… та відповідні мета-повідомлення для обговорення відповідності та закриття.

Відповіді:


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 файл для всіх нових запитів .

Це найшвидший і найпростіший спосіб відобразити повідомлення "Сайт тимчасово недоступний" під час повторного розгортання (або відкочування) змін на виробничому сервері.

Також, як зазначає marksidad , переконайтеся, що у вас є принаймні 512 байт вмісту у файлі, щоб IE6 візуалізував його правильно.


10
Не забувайте вирішувати "дружні" повідомлення IE: tinyurl.com/app-offline-friendly
Марк Сідаде

1
Ой! Будьте обережні, використовуючи це з MOSS 2007. Він буде працювати лише на сторінках, до яких звертався з моменту останнього перезапуску IIS. Отже, якщо ви додасте цю сторінку у свій віртуальний корінь wss, то спробуйте відкрити сторінку, до якої раніше не зверталися, ви отримаєте 404.
Марк

1
@Marc - Отримайте цю пораду від Скотта Гатрі, якщо ви відчуваєте себе щедрим, ви б допомогли багатьом розробникам SharePoint уникати цього сценарію, якби ви прокоментували статтю Гу: weblogs.asp.net/scottgu/archive/2005/10/ 06 / 426755.aspx
Троя ДеМонбреун

Крім того, це також спричинить переробку домену App і закриє будь-які відкриті підключення до бази даних, після закінчення всіх запитів.
Барт Веркойейн,

Існує застереження до цього: IIS повертає вміст app_offline.htm з кодом статусу HTTP 404. Якщо пошукова система блукає та намагатиметься індексувати ваш сайт, коли ви перебуваєте в цьому режимі офлайн, ви можете не оцінити результати. Але це чудово підходить для мого приватного корпоративного веб-додатку!
Ларрі Сільверман

119
throw new HttpException(404, "Article not found");

Це підхопить ASP.NET, який поверне сторінку customErrors. Про це дізналися в нещодавній .NET Повідомленні дня


Деякі розробники можуть стверджувати, що краще загортати речі вручну в HttpContext.Response, а не викидати виняток, який є досить дорогою операцією в книгах .NET.
lubos hasko

Це не погана форма? Ви показуєте помилку 404, тоді як ви хочете відобразити помилку / виняток.
Донні Томас

1
Я можу придумати один випадок, якщо хтось зловмисно псується з параметрами і вводить щось недійсне, ви, мабуть, хочете, щоб загальна 404 не була конкретною помилкою.
Джон Шихан

3
Оновлено виключно тому, що мені зараз відомий сайт .NET Tip of the Day.
Кон

він працює лише тоді, коли ви кинете його в httpModule або httpHandler
Khaled Musaied

75

Ось найкращий. Додайте це до свого web.config для МНОГО швидшої компіляції. Це повідомлення 3.5SP1 через цей QFE .

<compilation optimizeCompilations="true">

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

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

Щоб полегшити біль, ми додали «оптимізований» режим компіляції, який використовує набагато менш консервативний підхід до перекомпіляції.

Через тут :


6
Це "за замовчуванням" з VS 2010 чи мені все ж слід спробувати?
M4N

73
  • HttpContext.Current завжди надасть вам доступ до запиту / відповіді поточного контексту тощо тощо, навіть якщо ви не маєте доступу до властивостей сторінки (наприклад, із слабко пов'язаного допоміжного класу).

  • Ви можете продовжити виконання коду на одній сторінці після перенаправлення користувача на іншу, зателефонувавши на Response.Redirect ( URL , false )

  • Вам не потрібні файли .ASPX, якщо все, що вам потрібно, - це складена сторінка (або будь-який IHttpHandler ). Просто встановіть шлях та методи HTTP, щоб вказати на клас у <httpHandlers>елементі файлу web.config.

  • Сторінка об'єкт може бути витягнутий з .aspx файлу програмного шляхом виклику PageParser.GetCompiledPageInstance (віртуальний_путь, aspxFileName, Context)


Про Response.Redirect (url, false) - Це стільки те, на що я сподівався досить тривалий час .. Я не знаю, як я пропустив це, але ніж xxx
Subliminal Hash

1
Може хтось пояснить, що ви зробили б з цим? Я знаю, що це має деяку цінність, але я не можу зрозуміти, чому ...
Дін

5
Якщо ви хочете переспрямувати користувача на іншу адресу, але все ще потрібно виконати деяку зворотню обробку (наприклад, запит на створення звіту, який переспрямовує на сторінку статусу генерації звіту, поки він продовжує генерувати звіт у фоновому режимі)
Марк Cidade

Чи може хтось пояснити корисну ситуацію для PageParser.GetCompiledPageInstance (..)? Документи кажуть, що це для використання в інфраструктурі - він повертає тип IHttpHandler, тому я не бачу, як це можна практично використовувати.
Джон К

@jdk: Раніше я використовував це, коли переосмислював обробник за замовчуванням на * .aspx запити, тому я можу використовувати динамічні об'єкти IHttpHandler в пам'яті, але також використовувати GetCompiledPageInstance () для фізичних файлів * .aspx.
Марк Сідаде

70

Режим роздрібної торгівлі на рівні machine.config:

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

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


1
Я іноді забуваю змінити налагодження компіляції на помилкове перед публікацією, що негативно впливає на продуктивність. Більше жодних проблем!
Рой Тінкер

59

Увімкнення intellisense для MasterPages на сторінках із вмістом.
Я впевнений, що це дуже мало відомий хак

Більшу частину часу вам доводиться використовувати метод findcontrol і передавати елементи керування на головну сторінку зі сторінок вмісту, коли ви хочете їх використовувати, директива MasterType дозволить інтелігенції у візуальній студії після того, як ви перейдете до цього

просто додайте ще одну директиву на сторінку

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

Якщо ви не хочете використовувати Віртуальний шлях, а потім використовуйте ім'я класу

<%@ MasterType TypeName="MyMainMasterPage" %>

Повна стаття тут


Використання 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) Ви можете вмикати і вимикати Trace з коду:

#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, і навпаки, але вам потрібно повторно проаналізувати, щоб перевірити ваші елементи керування на нулі.


Я би проголосував за це, але не вистачало голосів. Я спробую згадати, щоб повернутися, щоб проголосувати за це. Я не знав, що ми можемо мати один і той же файл Code Behind для кількох сторінок. Не впевнений, як це буде працювати.
Вайбхав

5
Хтось ще думає, що ризик для безпеки дозволить активувати слід від URL-адреси? (# 1) Я не збираюся оскаржувати це питання, але важливо зрозуміти ризик.
Кевін Гофф

5
Абсолютно, ви дійсно повинні поставити цей код у блоці #ifdef DEBUG #endif
Radu094,

Чудові коментарі, що вказують на аспект безпеки.
Вайбхав

2
Чому для ризику безпеки активувати слід від URL-адреси? Як це можна використати для шкоди мені?
Камарей

48

Ви можете використовувати:

 Request.Params[Control.UniqueId] 

Щоб отримати значення елемента контролю, перед тим, як ініціалізувати перегляд, перегляд стану (Control.Text тощо буде порожнім у цій точці).

Це корисно для коду в Init.


Ініціалізація Viewstate не лікує Request.Params. Використовуйте його ДО ПОВЕРНЕННЯ підвищення способу LoadPostData управління, реалізованого IPostBackDataHandler.
chapluck

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
}

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>

Це було б дуже заплутано для інших розробників у вашій команді
Aykut Akıncı

1
@Aykut - Дійсно, це може бути, саме тому я констатую, що його корисність досить вузька, проте, коли потрібно, це дуже зручно. Крім того, я би переконався, що будь-яке використання картографування тегів було дуже чітко задокументоване, щоб уникнути плутанини та неоднозначності.
CraigTP

43

Модули Http . Архітектура шалено елегантна. Можливо, не прихована функція, але все-таки крута.


3
HttpModules - це щось удосконалене, але я б не називав це рідкісним або менш вживаним (або називав мене наївним). Але так, я люблю архітектуру.
Вайбхав

+1, оскільки багато досвідчених розробників можуть знати про HttpModules, але не повністю розуміють їх зв’язок із запитами. (Те ж саме і з HttpHandlers)
Джон Бубріскі

34

Ви можете використовувати коментарі ASP.NET на сторінці .aspx, щоб коментувати всі частини сторінки, включаючи елементи керування сервером. І вміст, який коментується, ніколи не надсилатиметься клієнту.

<%--
    <div>
        <asp:Button runat="server" id="btnOne"/>
    </div>
--%>

5
Є люди, які насправді не знають, що є коментарі?
Джо Філіпс

7
Мені це подобається, коли ти знайдеш половинку сторінки aspx у <! - коментарі ...
Брайан Рехбін

Це досить гола особливість 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);
    }
} 

1
що ви маєте на увазі під заголовком "та інші"?
Халед Мусаїд

Я думаю, я ніколи не потрапляв до інших.
andleer

2
+1, дуже класна функція ... Це насправді дуже схоже на розширення розмітки WPF
Thomas Levesque

Це не те саме, що використання <%= /*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. Або ви можете зареєструвати обробник програмно у вашому запуску програми у глобальному асоціації.
Філ

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, властивість ініціалізується на його ім’я. Коли законний користувач подає сторінку на сервер, вона ініціалізується з ім'ям зловмисника. Як результат, перевірка HSM ViewState виходить з ладу і створюється виняток.


2
Також не забудьте залишити базу.OnInit (e); для функції Page_Init () виконувати свою роботу.
Друїд

Я думаю, що цей трюк може вийти з ладу, якщо справжній користувач не прийняв файли cookie або якщо у sessionid є час очікування.
Арістос

1
Вам не потрібно, base.OnInit(e);якщо ви використовуєте AutoEventWireup="true"для сторінки.
Адам Нофсінгер

1
Друїд: Він не переважає OnInit (у такому випадку необхідна база. OnInit (e)).
crdx

Використання ідентифікатора сесії для ViewStateUserKey працює лише після того, як сеанс фактично розпочався. Це також означає, що ці сторінки можуть закінчитись після закінчення сеансу. У тих випадках, коли ці проблеми викликають занепокоєння, ви можете розглянути можливість використання більш тривалого, наприклад, IP-адреси користувача.
RickNZ

25

HttpContext.Current.IsDebuggingEnabled

Це чудово для визначення, які сценарії виводити (мінімум або повні версії) або що-небудь інше, що ви можете захотіти в програмі dev, але не в прямому ефірі.


Я погоджуюся з Яном, але іноді може бути цікаво мати додаток, який усвідомлює стан його виконання Налагодження / випуск.
Олександр Брісбуа,

20

Входить у ASP.NET 3.5 SP1:

  • customErrors тепер підтримує атрибут "redirectMode" зі значенням "ResponseRewrite". Показує сторінку помилок без зміни URL-адреси.
  • Тег форми тепер розпізнає атрибут дії. Чудово підходить, коли ви використовуєте переписування URL-адрес

20

Властивість DefaultButton у панелях.

Він встановлює кнопку за замовчуванням для певної панелі.


1
Увага, не працює на всіх видах кнопок, наприклад, LinkButtons!
Кову


19

Використання configSource для розділення файлів конфігурації.

Ви можете використовувати атрибут configSource у файлі web.config, щоб перемістити елементи конфігурації до інших .config файлів, наприклад, замість:

    <appSettings>
        <add key="webServiceURL" value="https://some/ws.url" />
        <!-- some more keys -->
    </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-проекту, ex Desktop. configs
Золтан Верес

17

Атрибут MaintainScrollPositionOnPostback в директиві Page. Він використовується для підтримки позиції прокрутки сторінки aspx у поштових списках.


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-каналів?
Dan Diplo

Я думаю, це залежить від складності проекту. Не кожен має здатність чи навички створювати та компілювати обробники. На сторінці 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: // ім'я сервера / сторінка / Param1 / SomeParams1 / Param2 / SomeParams2, будуть відображені на іншій сторінці, як нижче (часто використовуючи регулярні вирази).

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

DotNetNuke має дійсно хороший HttpModule, який робить це для своїх дружніх URL-адрес. Досі корисний для машин, де ви не можете розгорнути .NET v3.5.


Для цього потрібно зіставити всі запити IIS на ASP.NET
Джон Шин

Або просто обробник помилок 404.
FlySwat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.