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

292

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

Дополнительная информация: https://stackoverflow.com/faq


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

Что вы знаете?

  • 0
    Хороший вопрос, я хотел бы проголосовать несколько раз!
  • 1
    Согласовано. Я люблю такие темы. В основе так много глубины, что вы иногда удивляетесь вещам, о которых никогда не подозревали.
Показать ещё 3 комментария
Теги:

53 ответа

319

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

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
        </smtp>
    </mailSettings>
</system.net>
  • 6
    В самом деле? Я собирался установить поддельный SMTP-сервер, такой как Dumbster. Я спрятал драгоценный камень.
  • 2
    Кто-нибудь знает, можете ли вы указать общий ресурс UNC для расположения каталога?
Показать ещё 7 комментариев
220

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

Это самый быстрый и простой способ отобразить уведомление о недоступности "Site Temporarily Unavailable" при повторном развертывании (или откате) изменений на сервере Production.

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

  • 10
    Не забудьте обходной путь для «дружеских» сообщений IE: tinyurl.com/app-offline-friendly
  • 1
    Ой! Будьте осторожны при использовании этого с MOSS 2007. Он будет работать только для страниц, к которым был получен доступ после последнего перезапуска IIS. Итак, если вы добавите эту страницу в свой виртуальный корень wss, а затем попытаетесь открыть страницу, к которой ранее не обращались, вы получите 404.
Показать ещё 3 комментария
119
throw new HttpException(404, "Article not found");

Это поймает ASP.NET, который вернет страницу customErrors. Узнал об этом в недавнем .NET-сообщении дня дня

  • 0
    Некоторые разработчики могут утверждать, что лучше обернуть вещи вручную в HttpContext.Response, а не создавать исключение, которое является довольно дорогой операцией в книгах .NET.
  • 0
    Разве это не плохая форма? Вы показываете ошибку 404, в то время как вы хотите отобразить ошибку / исключение.
Показать ещё 3 комментария
75

Здесь лучший. Добавьте это в свой 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 минут до обновить страницу после внесения любых изменений к сборке бункеров.

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

Через здесь:

  • 6
    Это «по умолчанию» с VS 2010 или я все еще должен попробовать?
73

Режим розничной продажи на уровне machine.config:

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

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

  • 1
    Я иногда забываю перед публикацией изменить отладку компиляции на false, что негативно влияет на производительность. Нет проблем больше!
70
  • HttpContext.Current всегда будет предоставлять вам доступ к текущему контексту Request/Response/etc., даже если у вас нет доступа к свойствам страницы (например, от слабого -связанный вспомогательный класс).

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

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

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

  • 0
    Об Response.Redirect (url, false) - это то, на что я надеялся довольно долгое время .. Я не знаю, как я это пропустил, но thanxxx
  • 1
    Может кто-нибудь объяснить, что вы будете делать с этим? Я знаю, что это имеет какое-то значение, но я не могу понять, почему ...
Показать ещё 5 комментариев
57

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

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

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

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

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

<%@ MasterType TypeName="MyMainMasterPage" %>

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

  • 0
    Использование FindControl иногда может быть беспокойным, спасибо за этот отличный совет!
  • 4
    Использование этого может привести к неожиданному поведению. См. Stackoverflow.com/questions/1998931/…
Показать ещё 2 комментария
56

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

  • 2
    Это также будет моей целью, я использую это во вложенных элементах управления для передачи / получения информации уровня запроса. Я также использую это в MVC для хранения списка js-файлов для добавления, основанного на частичных представлениях.
  • 1
    Я использую это, когда использую маршрутизацию asp.net для передачи параметров, извлеченных из URL-адресов, на мои страницы. (не с MVC) отлично подходит для переписывания URL и довольно гибок.
Показать ещё 1 комментарий
50

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

 Request.Params[Control.UniqueId] 

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

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

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

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

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.

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

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
}
45

HttpModules. Архитектура безумно элегантна. Возможно, это не скрытая функция, но, тем не менее, прохладно.

  • 3
    HttpModules - это то, что является передовым, но я бы не назвал это редким или менее используемым (или назовите меня наивным). Но да, я люблю архитектуру.
  • 0
    +1, потому что многие опытные разработчики могут знать о HttpModules, но не до конца понимают свою связь с запросами. (То же самое с HttpHandlers)
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>
  • 0
    Это было бы очень запутанным для других разработчиков в вашей команде
  • 1
    @Aykut - Действительно, это может быть, поэтому я утверждаю, что его полезность довольно узка, однако, когда требуется, это очень удобно. Кроме того, я бы позаботился о том, чтобы любое использование Tag Mapping было очень четко задокументировано, чтобы избежать путаницы и двусмысленности.
34

Конструктор выражений кода

Пример разметки:

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);
    }
} 
  • 1
    что вы имеете в виду с "и другие" в названии?
  • 0
    Ну, я думаю, я никогда не добрался до других.
Показать ещё 2 комментария
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, если вам это нужно, иначе его там не будет.
  • 3
    Стоит также отметить, что вы можете указать настройку обработчика в файле web.config, чтобы вам не нужно было размещать физический файл Ashx. Или вы можете программно зарегистрировать обработчик в вашем приложении при запуске в глобальном asax.
33

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

<%--
    <div>
        <asp:Button runat="server" id="btnOne"/>
    </div>
--%>
  • 5
    Есть люди, которые действительно не знают, что есть комментарии?
  • 0
    Это скрытая особенность? : о
Показать ещё 2 комментария
28

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

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

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

  • 2
    Также не забудьте покинуть базу. OnInit (e); для функции Page_Init (), чтобы сделать свою работу.
  • 0
    Я думаю, что этот трюк может потерпеть неудачу, если реальный пользователь не принимает куки или если у sessionid есть тайм-аут.
Показать ещё 4 комментария
25

HttpContext.Current.IsDebuggingEnabled

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

  • 0
    Просто используйте #IF DEBUG
  • 0
    Я согласен с Яном, но иногда может быть интересно иметь приложение, которое знает о своем состоянии выполнения Debug / Release.
21

Включено в 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>

... вы можете иметь весь раздел appSettings, хранящийся в другом файле конфигурации. Здесь новый web.config:

    <appSettings configSource="myAppSettings.config" />

Файл myAppSettings.config:

    <appSettings>        
        <add key="webServiceURL" value="https://some/ws.url" />
        <!-- some more keys -->
    </appSettings>

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

ref: http://weblogs.asp.net/fmarguerie/archive/2007/04/26/using-configsource-to-split-configuration-files.aspx

  • 1
    Это также работает с любым типом проекта .net, например, с приложением Desktop. конфиги
19

У ScottGu есть куча трюков в http://weblogs.asp.net/scottgu/archive/2006/04/03/441787.aspx

17

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

  • 1
    Комментарий будет полезен для улучшения ответа.
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>
16

HttpContext.IsCustomErrorEnabled - замечательная функция. Я нашел ее полезной не один раз. Ниже приведена короткая публикация.

13

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

  • 7
    Не лучше ли использовать обработчик .ASHX для создания RSS-каналов?
  • 0
    Я предполагаю, что это зависит от сложности проекта. Не каждый обладает способностью или навыками создавать и компилировать обработчики. На странице asp.net работает достаточно хорошо для этого
Показать ещё 3 комментария
12

Моя команда использует это как хак:

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" вчера.

  • 7
    Вы также знаете о классе System.Net.WebClient, верно?
  • 0
    Итак, основной момент моей ИТ-карьеры до сих пор получал ответ "Гетто" Гансельмана. Милая!
12

До добавления добавленных маршрутов 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.

  • 0
    Это требует сопоставления всех запросов IIS к ASP.NET
  • 0
    Или просто обработчик ошибок 404.
11

Знаете ли вы, что можно запускать 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.
    }
}
10

CompilationMode = "Никогда" - это функция, которая может иметь решающее значение на некоторых сайтах ASP.NET.

Если у вас есть приложение ASP.NET, где ASPX-страницы часто генерируются и обновляются с помощью CMS или другой системы публикации, важно использовать CompilationMode = "Never".

Без этой настройки в результате изменения файла ASPX будут выполняться повторные компиляции, которые быстро заставят ваш appdomain перезагрузиться. Это может уничтожить состояние сеанса и кеш httpruntime, не говоря уже о задержке, вызванной перекомпиляцией.

(Чтобы предотвратить перекомпиляцию, вы можете увеличить параметр numRecompilesBeforeAppRestart, но это не идеально, поскольку оно потребляет больше памяти.)

Одно из предостережений для этой функции заключается в том, что страницы ASPX не могут содержать никаких кодовых блоков. Чтобы обойти это, можно поместить код в пользовательские элементы управления и/или базовые классы.

Эта функция в основном не имеет значения в случаях, когда страницы ASPX часто не меняются.

9

мне пришла в голову одна особенность, иногда вам нужно будет скрыть часть вашей страницы от людей. вы можете сделать это с помощью javascript или с помощью этого простого кода:

if (Request.Browser.Crawler){
        HideArticleComments();
  • 2
    это не всегда работает, так как некоторые гусеничные игры подделывают нормальный трафик.
  • 0
    Это действительно плохой SEO. Если вы прячете вещи от сканеров, вы будете наказаны в рейтинге. Это также вводит в заблуждение.
9
9

Действительный синтаксис, который VS задыхается:

<input type="checkbox" name="roles" value='<%# Eval("Name") %>' 
  <%# ((bool) Eval("InRole")) ? "checked" : "" %> 
  <%# ViewData.Model.IsInRole("Admin") ? "" : "disabled" %> />
8

Аналогично решению 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>

Это значительно увеличивает время разработки, вам просто нужно инвестировать в память для компьютера:)

Счастливое программирование!

Вагнер Данда

7

Request.IsLocal Свойство:

Указывает, поступает ли текущий запрос с локального компьютера или нет.

if( Request.IsLocal )
{
   LoadLocalAdminMailSettings();
}
else
{
   LoadServerAdminMailSettings();
}
  • 4
    Пожалуйста, также проверьте следующее обсуждение на форумах asp.net о проблемах безопасности при использовании свойства Request.IsLocal forums.asp.net/t/1065813.aspx
  • 0
    Да лучше избегайте этого и используйте - если DEBUG
7

Я думал, что это было аккуратно, когда я сбрасывал xmlDocument() в метку и отображал ее с помощью xsl.

  • 2
    литерал / заполнитель будет более подходящим, чем метка ...
6

По умолчанию любая страница веб-формы наследуется от класса System.Web.UI.Page. Что делать, если вы хотите, чтобы ваши страницы наследовались от пользовательского базового класса, который наследуется от System.Web.UI.Page?

Есть способ ограничить любую страницу наследованием от вашего собственного базового класса. Просто добавьте новую строку на web.config:

<system.web>
    <pages pageBaseType="MyBasePageClass" />
</system.web>

Внимание: это допустимо только в том случае, если ваш класс является автономным. Я имею в виду класс, который не имеет кода, который выглядит как <%@ Page Language="C#" AutoEventWireup="true" %>

6

Метод EnsureChildControls: он проверяет дочерние элементы управления, если они инициированы. Если дочерние элементы управления не инициируются, он вызывает метод CreateChildControls.

5

Прикрепите класс, расположенный в папке App_Code, к вашему файлу глобального приложения.

ASP.NET 2.0 - Global.asax - Код за файлом.

Это также работает в Visual Studio 2008.

4

Многие люди упомянули, как оптимизировать ваш код при перекомпиляции. Недавно я обнаружил, что могу выполнить большую часть моей разработки (на основе кода) на странице 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

  • 1
    Если вы используете проект веб-сайта вместо веб-приложения, вы можете написать код в коде позади, и asp.net скомпилирует его для вас за сценой. Вам не нужно будет компилировать проект самостоятельно.
  • 7
    В большинстве случаев есть много веских причин не делать этого.
Показать ещё 1 комментарий
4

Вы можете найти любой элемент управления, используя свойство UniqueID:

Label label = (Label)Page.FindControl("UserControl1$Label1");
  • 10
    Да, но жесткое кодирование уникального идентификатора плохо, так как он подвержен изменениям между средами выполнения .net.
  • 0
    UniqueID также полезен для установки кнопки формы по умолчанию / принять.
2

'file' атрибут элемента appsettings в web.config.

Задает относительный путь к внешнему файлу, который содержит настройки конфигурации пользовательского приложения.

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

Поскольку любые изменения в файле Web.config заставляют приложение перезагружаться, использование отдельного файла позволяет пользователям изменять значения, находящиеся в разделе appSettings, не приводя к перезапуску приложения. Содержимое отдельного файла объединено с секцией appSettings в файле Web.config.

2

Если вы используете веб-службы вместо служб 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) заставьте пользователя снова войти в систему.

2

Свойство ClientScript на объекте страницы.

1

Переменные приложения могут использоваться с веб-приложением для обмена данными по всему приложению. Он инициализируется в файле Global.asax и используется через страницы в этом веб-приложении всем пользователем, независимо от создаваемого ими сеанса.

0

Шаблоны пользовательских элементов управления. Как только вы знаете, как они работают, вы увидите всевозможные возможности. Здесь простейшая реализация:

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

0

Можно упаковать страницы ASPX в библиотеку (DLL) и обслуживать их с помощью механизма ASP.NET.

Вам нужно будет реализовать свой собственный VirtualPathProvider, который будет загружаться через определенные DLL файлы Relfection, или вы можете включить имя DLL в своем путь к файлу. Это зависит от вас.

Магия происходит при переопределении метода VirtualFile.Open, где вы возвращаете ASPX файл в качестве ресурса из класса Assembly: Assembly.GetManifestResourceStream. Механизм ASP.NET обрабатывает ресурс, поскольку он обслуживается через VirtualPathProvider.

Это позволяет подключаемым страницам или, как и я, использовать его для включения HttpHandler с элементом управления.

-2

Одна из вещей, которые я использую для работы с несколькими версиями VB, VBScript и VB.NET, заключается в преобразовании значений набора записей в строку, чтобы исключить множественные тесты для NULL или пробела. т.е. Trim(rsData("FieldName").Value & " ")
В случае целого числа это будет: CLng("0" & Trim(rsData("FieldName").Value & " "))

  • 1
    Это плохо для производительности. Кроме того, вы не должны использовать старые наборы записей в vb.net.
  • 0
    наборы записей / читатель - одно и то же, другое имя
Показать ещё 1 комментарий
-7

После того, как веб-сайт был опубликован и развернут на производственном сервере, если нам нужно сделать некоторые изменения на кнопке 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

Таким образом, мы можем легко исправить ошибки производственного сервера без перераспределения.

  • 4
    Разве это не становится архаичным через некоторое время? Почему не лучше правильно управлять процессом сборки и развертывания? Моя первоначальная реакция заключается в том, что это не «скрытая» функция, а довольно плохое использование хорошо известного new ключевого слова.
  • 1
    У нас есть процедуры развертывания и проверки, чтобы избежать чего-либо подобного удаленно, а также предварительно скомпилировать что-нибудь из asp.net ...
Показать ещё 4 комментария
-7

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

  • 0
    Разумеется, отражение не является скрытой функцией asp.net ... и да, вопрос должен быть всеобъемлющим ...
  • 0
    Я не уверен, что бы вы определили под «скрытой функцией» тогда. Вы можете подумать о добавлении примера того, что вы считаете скрытой функцией.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню