Ukryte funkcje ASP.NET [zamknięte]


292

To pytanie istnieje, ponieważ ma znaczenie historyczne, ale nie jest uważane za dobre, tematyczne pytanie dla tej witryny, więc nie używaj go jako dowodu, że możesz zadawać podobne pytania tutaj.

Więcej informacji: https://stackoverflow.com/faq


Zawsze są funkcje przydatne w scenariuszach skrajnych, ale właśnie z tego powodu większość ludzi ich nie zna. Proszę o funkcje, których zwykle nie uczą podręczniki.

Jakie są te, które znasz?


Dobre pytanie, chciałbym móc głosować wiele razy!
Gavin Miller

1
Zgoda. Uwielbiam takie wątki. Struktura jest tak głęboka, że ​​czasami zdumiewa cię to, o czym nigdy nie wiedziałeś.
Deane

Uczę się tylu nowych fajnych sztuczek na podstawie odpowiedzi w tym wątku - dzięki! :)
Maxim Zaslavsky

16
Zamiast „Ukryte funkcje…” nie powinny być nazywane „mało znanymi funkcjami…”, ponieważ większość każdej odpowiedzi jest dobrze udokumentowana w MSDN lub gdzie indziej, po prostu mało znana lub używana.
John K

Zobacz meta.stackexchange.com/questions/56669/… , meta.stackexchange.com/questions/57226 /... i powiązane posty Meta, aby omówić stosowność i zamknięcie.

Odpowiedzi:


335

Podczas testowania możesz wysyłać wiadomości e-mail do folderu na komputerze zamiast na serwer SMTP. Umieść to w swoim web.config:

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
        </smtp>
    </mailSettings>
</system.net>

6
Naprawdę? Właśnie miałem zainstalować fałszywy serwer SMTP, taki jak Dumbster. Ukryłem klejnot.
Eduardo Molteni,

2
Czy ktoś wie, czy możesz określić udział UNC dla lokalizacji katalogu?
Mark Sherretta

32
Jeszcze lepiej, umieść to na dev box machine.config, abyś nie musiał zmieniać web.config w każdej tworzonej aplikacji.
Max Toro

Czy możesz to ustawić tak, aby działało to tylko na lokalnym hoście? W ten sposób nie musisz go zmieniać za każdym razem?
chobo2,

Nie ma na to żadnego ustawienia. Będziesz musiał zarządzać różnic konfiguracyjnych za pomocą innych metod (projekty, zadania wdrażania sieci budować, etc)
John Sheehan

210

Jeśli umieścisz plik o nazwie app_offline.htm w katalogu głównym katalogu aplikacji WWW, ASP.NET 2.0+ zamknie aplikację i zatrzyma normalne przetwarzanie wszelkich nowych przychodzących żądań dla tej aplikacji, pokazując tylko zawartość app_offline.htm plik dla wszystkich nowych wniosków .

Jest to najszybszy i najłatwiejszy sposób wyświetlenia powiadomienia „Witryna tymczasowo niedostępna” podczas ponownego wdrażania (lub wycofywania) zmian na serwerze produkcyjnym.

Ponadto, jak zauważył Marksidad , upewnij się, że masz co najmniej 512 bajtów zawartości w pliku, aby IE6 poprawnie go renderował.


10
Nie zapomnij o obejściu „przyjaznych” wiadomości IE: tinyurl.com/app-offline-friendly
Mark Cidade

1
Auć! Zachowaj ostrożność podczas korzystania z tej funkcji w MOSS 2007. Będzie działać tylko w przypadku stron, do których uzyskano dostęp od czasu ostatniego ponownego uruchomienia IIS. Tak więc, jeśli dodasz tę stronę do wirtualnego katalogu głównego wss, a następnie spróbuj otworzyć stronę, do której wcześniej nie uzyskiwano dostępu, otrzymasz 404.
Marc

1
@Marc - Otrzymałem tę wskazówkę od Scotta Guthrie, jeśli czujesz się hojny, pomógłbyś wielu deweloperom SharePoint uniknąć tego scenariusza, jeśli skomentowałeś artykuł Gu: weblogs.asp.net/scottgu/archive/2005/10/ 06 / 426755.aspx
Troy DeMonbreun

Ponadto spowoduje to również ponowne uruchomienie domeny aplikacji i zamknie wszystkie otwarte połączenia z bazą danych po zakończeniu wszystkich żądań.
Bart Verkoeijen

Jest jedno zastrzeżenie: IIS zwraca zawartość app_offline.htm z kodem stanu HTTP 404. Jeśli wyszukiwarka wędruje i spróbuje zaindeksować witrynę, gdy jesteś w trybie offline, możesz nie docenić wyników. Ale działa świetnie w mojej prywatnej korporacyjnej aplikacji internetowej!
Larry Silverman,

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

To zostanie przechwycone przez ASP.NET, który zwróci stronę customErrors. Dowiedziałem się o tym w ostatnim poście .NET Tip of the Day Post


Niektórzy programiści mogą argumentować, że lepiej jest ręcznie owijać rzeczy w HttpContext.Response, zamiast zgłaszać wyjątek, który jest dość kosztowną operacją w książkach .NET.
lubos hasko

Czy to nie jest zła forma? Wyświetlany jest błąd 404, podczas gdy chcesz wyświetlić błąd / wyjątek.
Donnie Thomas

1
Jednym z przykładów, o których mogę pomyśleć, jest to, że jeśli ktoś złośliwie psuje parametry i wprowadza coś nieprawidłowego, prawdopodobnie chcesz, aby ogólny błąd 404 nie był konkretnym błędem.
John Sheehan

3
Pozytywnie oceniany, ponieważ teraz jestem świadomy witryny .NET Tip of the Day.
Kon

działa tylko wtedy, gdy wrzucisz go do httpModule lub httpHandler
Khaled Musaied

75

Oto najlepszy. Dodaj to do pliku web.config, aby uzyskać DUŻO szybszą kompilację. To jest po 3.5SP1 za pośrednictwem tego QFE .

<compilation optimizeCompilations="true">

Szybkie podsumowanie: wprowadzamy nowy przełącznik optimizeCompilations w ASP.NET, który może znacznie poprawić szybkość kompilacji w niektórych scenariuszach. Istnieje kilka połowów, więc czytaj dalej, aby uzyskać więcej informacji. Ten przełącznik jest obecnie dostępny jako QFE dla 3.5SP1 i będzie częścią VS 2010.

System kompilacji ASP.NET przyjmuje bardzo konserwatywne podejście, które powoduje, że usuwa wszelkie poprzednie prace, które wykonał za każdym razem, gdy zmienia się plik „najwyższego poziomu”. Pliki „najwyższego poziomu” zawierają wszystko w bin i App_Code, a także global.asax. Chociaż działa to dobrze w przypadku małych aplikacji, staje się prawie bezużyteczne w przypadku bardzo dużych aplikacji. Np. Klient wpadł na przypadek, w którym odświeżenie strony zajęło 10 minut po wprowadzeniu jakichkolwiek zmian w zestawie „bin”.

Aby złagodzić ból, dodaliśmy „zoptymalizowany” tryb kompilacji, który przyjmuje znacznie mniej konserwatywne podejście do ponownej kompilacji.

Via tutaj :


6
Czy jest to „domyślnie włączone” w VS 2010, czy powinienem to wypróbować?
M4N,

73
  • HttpContext.Current zawsze zapewnia dostęp do żądania / odpowiedzi / bieżącego kontekstu, nawet gdy nie masz dostępu do właściwości strony (np. Z luźno powiązanej klasy pomocnika).

  • Możesz kontynuować wykonywanie kodu na tej samej stronie po przekierowaniu użytkownika na inny, wywołując Response.Redirect ( url , false )

  • Nie potrzebujesz plików .ASPX , jeśli wszystko, czego potrzebujesz, to skompilowana strona (lub dowolny IHttpHandler ). Wystarczy ustawić ścieżkę i metody HTTP, aby wskazywały klasę w <httpHandlers>elemencie pliku web.config.

  • Obiekt strony można pobrać programowo z pliku .ASPX , wywołując PageParser.GetCompiledPageInstance (virtualPath, aspxFileName, Context)


About Response.Redirect (url, false) - To tyle, na co liczyłem od dłuższego czasu .. Nie wiem, jak to przegapiłem, ale thanxxx
Subliminal Hash

1
Czy ktoś może wyjaśnić, co byś z tym zrobił? Wiem, że to ma jakąś wartość, ale nie mogę zrozumieć, dlaczego ...
Deane

5
Jeśli chcesz przekierować użytkownika na inny adres, ale nadal masz trochę przetwarzania zaplecza (np. Żądanie generowania raportu, które przekierowuje na stronę statusu generowania raportu, podczas gdy nadal generuje raport w tle)
Mark Cidade

Czy ktoś może wyjaśnić użyteczną sytuację dla PageParser.GetCompiledPageInstance (..)? Dokumenty mówią, że jest do użytku w infrastrukturze - zwraca typ IHttpHandler, więc nie widzę, jak można go praktycznie wykorzystać.
John K,

@jdk: Używałem go w przeszłości podczas nadpisywania domyślnego modułu obsługi żądań * .aspx, dzięki czemu mogę używać dynamicznych obiektów IHttpHandler w pamięci, ale także używać GetCompiledPageInstance () dla fizycznych plików * .aspx.
Mark Cidade

70

Tryb sprzedaży detalicznej na poziomie machine.config:

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

Zastępuje ustawienia web.config, aby wymusić debugowanie na false, włącza niestandardowe błędy i wyłącza śledzenie. Nie musisz już zapominać o zmianie atrybutów przed opublikowaniem - po prostu pozostaw je wszystkie skonfigurowane dla środowisk programistycznych lub testowych i zaktualizuj ustawienia produkcji detalicznej.


1
Czasami zapominam zmienić debugowanie kompilacji na false przed opublikowaniem, co negatywnie wpływa na wydajność. Nie ma już problemu!
Roy Tinker,

59

Włączanie intellisense dla MasterPages na stronach z treściami
Jestem pewien, że jest to bardzo mało znany hack

W większości przypadków musisz użyć metody findcontrol i rzucić formanty na stronie wzorcowej ze stron zawartości, gdy chcesz ich użyć, dzięki dyrektywie MasterType włączysz intellisense w Visual Studio, gdy tylko to zrobisz.

po prostu dodaj do strony jeszcze jedną dyrektywę

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

Jeśli nie chcesz korzystać z wirtualnej ścieżki i zamiast tego użyj nazwy klasy

<%@ MasterType TypeName="MyMainMasterPage" %>

Pobierz pełny artykuł tutaj


Korzystanie z FindControl może być czasem gorączkowe, dzięki za tę wspaniałą wskazówkę!
Alexandre Brisebois,

4
Korzystanie z tego może spowodować nieoczekiwane zachowanie. Zobacz stackoverflow.com/questions/1998931/...
citronas

Osobiście uważam, że funkcja powinna pozostać nieznana, łączy stronę ze stroną główną. Jeśli w końcu użyjesz właściwości / metod strony głównej, a następnie zmienisz stronę główną, skończysz koszmarem konserwacji.
Phill

@Phil: Czasami jest to potrzebne i posiadanie statycznie wpisanego dostępu do strony głównej jest znacznie lepsze niż podejście FindControl. Przynajmniej dostaniesz komunikat kompilatora i możesz go szybko naprawić.
Durden81

58

HttpContext.Items jako narzędzie buforujące na poziomie żądania


2
To też będzie mój punkt, używam tego w kontrolerach zagnieżdżonych do przekazywania / odbierania informacji o poziomie żądania. Używam tego również w MVC do przechowywania listy plików js do dołączenia, opartych na widokach częściowych.
Tracker1

1
Używam tego, gdy używam routingu asp.net do przekazywania parametrów pobranych z adresów URL na moje strony. (nie w przypadku MVC) doskonale nadaje się do przepisywania adresów URL i jest dość elastyczny.
Alexandre Brisebois,

Hmmmm, właśnie pomyślałem o miejscu, w którym mógłbym użyć tego zamiast sesji - ta!
Mike Kingscott,

52

Dwie rzeczy wyróżniają się w mojej głowie:

1) Możesz włączyć lub wyłączyć Śledzenie za pomocą kodu:

#ifdef DEBUG 
   if (Context.Request.QueryString["DoTrace"] == "true")
                {
                    Trace.IsEnabled = true;
                    Trace.Write("Application:TraceStarted");
                }
#endif

2) Możesz zbudować wiele stron .aspx przy użyciu tylko jednego udostępnionego pliku „zakodowanego”.

Zbuduj jeden plik .cs klasy:

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";
        }
    }

a następnie możesz mieć dowolną liczbę stron .aspx (po usunięciu kodu .designer.cs i .cs wygenerowanego przez 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>

Możesz mieć kontrolki w ASPX, które nie pojawiają się w klasie 1 i na odwrót, ale musisz pamiętać, aby sprawdzić, czy nie ma w nich kontroli.


Głosowałbym za tym, ale zabrakło mi głosów. Spróbuję i pamiętam, aby wrócić i zagłosować w tej sprawie. Nie wiedziałem, że możemy mieć ten sam plik Code Behind dla wielu stron. Nie jestem pewien, jak to by działało.
Vaibhav,

5
Czy ktoś jeszcze uważa, że ​​aktywacja śledzenia z adresu URL stanowi zagrożenie bezpieczeństwa? (# 1) Nie zamierzam głosować za tym pytaniem, ale ważne jest, aby zrozumieć ryzyko.
Kevin Goff,

5
Absolutnie powinieneś naprawdę umieścić ten kod w bloku #ifdef DEBUG #endif
Radu094,

Świetne komentarze, wskazujące na aspekt bezpieczeństwa.
Vaibhav,

2
Dlaczego aktywowanie śledzenia z adresu URL jest zagrożeniem dla bezpieczeństwa? Jak można go zranić?
Kamarey,

48

Możesz użyć:

 Request.Params[Control.UniqueId] 

Aby uzyskać wartość kontrolki PRZED zainicjalizowaniem stanu widoku (Control.Text itp. Będzie pusty w tym momencie).

Jest to przydatne dla kodu w Init.


Inicjalizacja Viewstate nie działa z Request.Params. Użyj go PRZED podniesieniem metody LoadPostData kontroli zaimplementowanej IPostBackDataHandler.
chapluck,

46

WebMethods.

Można używać wywołań zwrotnych AJAX ASP.NET do metod sieciowych umieszczonych na stronach ASPX. Możesz ozdobić metodę statyczną za pomocą atrybutów [WebMethod ()] i [ScriptMethod ()]. Na przykład:

[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();
}

Teraz na stronie ASPX możesz to zrobić:

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

I wywołaj metodę po stronie serwera za pomocą JavaScript, używając:

    <script type="text/javascript">
    function GetFruit(l)
    {
        PageMethods.GetFruitBeginingWith(l, OnGetFruitComplete);
    }

    function OnGetFruitComplete(result)
    {
        alert("You got fruit: " + result);
    }
</script>

45

Przed rozpoczęciem długotrwałego zadania sprawdź, czy klient jest nadal podłączony:

if (this.Response.IsClientConnected)
{
  // long-running task
}

44

Jedną mało znaną i rzadko używaną funkcją ASP.NET jest:

Mapowanie tagów

Jest rzadko używany, ponieważ jest tylko konkretna sytuacja, w której będziesz go potrzebować, ale gdy go potrzebujesz, jest to bardzo przydatne.

Niektóre artykuły o tej mało znanej funkcji:

Mapowanie znaczników w ASP.NET
Korzystanie z mapowania znaczników w ASP.NET 2.0

i z tego ostatniego artykułu:

Mapowanie znaczników umożliwia zamianę zgodnych elementów sterujących w czasie kompilacji na każdej stronie aplikacji internetowej. Przydatnym przykładem jest sytuacja, w której masz zapasową kontrolkę ASP.NET, taką jak DropDownList, i chcesz zastąpić ją niestandardową kontrolką pochodzącą z DropDownList. Może to być formant, który został dostosowany w celu zapewnienia bardziej zoptymalizowanego buforowania danych wyszukiwania. Zamiast edytować każdy formularz internetowy i zastępować wbudowane DropDownLists niestandardową wersją, możesz w efekcie wykonać ASP.NET, modyfikując web.config:

<pages>
 <tagMapping>
   <clear />
   <add tagType="System.Web.UI.WebControls.DropDownList"
        mappedTagType="SmartDropDown"/>
  </tagMapping>
</pages>

Byłoby to bardzo mylące dla innych programistów w twoim zespole
Aykut Akıncı

1
@Aykut - Rzeczywiście może tak być, dlatego stwierdzam, że jego użyteczność jest raczej wąska, jednak w razie potrzeby bardzo przydatna. Chciałbym również upewnić się, że wszelkie użycie mapowania tagów było bardzo wyraźnie udokumentowane, aby uniknąć nieporozumień i dwuznaczności.
CraigTP

43

HttpModules . Architektura jest szalenie elegancka. Może nie jest to ukryta funkcja, ale mimo wszystko fajna.


3
HttpModules jest czymś zaawansowanym, ale nie nazwałbym tego rzadkim lub rzadziej używanym (lub nazwałby mnie naiwnym). Ale tak, kocham architekturę.
Vaibhav,

+1, ponieważ wielu doświadczonych programistów może wiedzieć o HttpModules, ale nie w pełni rozumie ich związek z żądaniami. (To samo z HttpHandlers)
John Bubriski

34

Za pomocą komentarzy ASP.NET na stronie .aspx można komentować pełne części strony, w tym kontrolki serwera. Treść skomentowana nigdy nie zostanie wysłana do klienta.

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

5
Są ludzie, którzy naprawdę nie wiedzą, że są komentarze?
Joe Phillips

7
Podoba mi się, gdy znajdziesz pół strony aspx w <! - komentarze ...
Bryan Rehbein

Jest to raczej naga funkcja ASP.NET
rafek

34

Konstruktor wyrażeń kodowych

Przykładowy znacznik:

Text = '<%$ Code: GetText() %>'
Text = '<%$ Code: MyStaticClass.MyStaticProperty %>'
Text = '<%$ Code: DateTime.Now.ToShortDateString() %>'
MaxLenth = '<%$ Code: 30 + 40 %>'

Prawdziwe piękno konstruktora wyrażeń kodu polega na tym, że można używać wiązania danych jak wyrażeń w sytuacjach niezwiązanych z danymi. Możesz także tworzyć inne Konstruktory wyrażeń, które wykonują inne funkcje.

web.config:

<system.web>    
    <compilation debug="true">
        <expressionBuilders>
            <add expressionPrefix="Code" type="CodeExpressionBuilder" />

Klasa cs, która sprawia, że ​​wszystko się dzieje:

[ExpressionPrefix("Code")]
public class CodeExpressionBuilder : ExpressionBuilder
{
    public override CodeExpression GetCodeExpression(
        BoundPropertyEntry entry,
        object parsedData,
        ExpressionBuilderContext context)
    {            
        return new CodeSnippetExpression(entry.Expression);
    }
} 

1
co masz na myśli z „i innymi” w tytule?
Khaled Musaied

Cóż, chyba nigdy nie dotarłem do innych.
andleer

2
+1, naprawdę fajna funkcja ... To właściwie całkiem podobne do rozszerzeń WPF
Thomas Levesque

czy to nie to samo, co używanie <%= /*code*/ %>?
bevacqua

33

Użycie typu pliku ASHX:
Jeśli chcesz po prostu wyprowadzić jakiś podstawowy HTML lub XML bez przechodzenia przez procedury obsługi zdarzeń strony, możesz zaimplementować HttpModule w prosty sposób

Nazwij stronę jako SomeHandlerPage.ashx i po prostu umieść w niej poniższy kod (tylko jeden wiersz)

<%@ webhandler language="C#" class="MyNamespace.MyHandler" %>

Następnie plik kodu

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
Warto zauważyć, że należy dodać IRequiresSessionState lub IReadOnlySessionState, jeśli jest to potrzebne, w przeciwnym razie go nie będzie.
Tracker1

3
Warto również zauważyć, że możesz określić konfigurację modułu obsługi w pliku web.config, więc nie musisz mieć fizycznego pliku ashx. Lub możesz zarejestrować programowo program obsługi w aplikacji start w globalnym asaxie.
Phill



26

Pracowałem nad aplikacją asp.net, która przeszła audyt bezpieczeństwa prowadzony przez wiodącą firmę ochroniarską i nauczyłem się tej prostej sztuczki, aby zapobiec mniej znanej, ale ważnej luce w zabezpieczeniach.

Poniższe wyjaśnienie pochodzi z: http://www.guidanceshare.com/wiki/ASP.NET_2.0_Security_Guidelines_-_Parameter_Manipulation#Consider_Using_Page.ViewStateUserKey_to_Counter_One-Click_Attacks

Rozważ użycie Page.ViewStateUserKey do przeciwdziałania atakom za pomocą jednego kliknięcia. Jeśli uwierzytelniasz osoby dzwoniące i używasz ViewState, ustaw właściwość Page.ViewStateUserKey w module obsługi zdarzeń Page_Init, aby zapobiec atakom za pomocą jednego kliknięcia.

void Page_Init (object sender, EventArgs e) {
  ViewStateUserKey = Session.SessionID;
}

Ustaw właściwość na wartość, o której wiesz, że jest unikalna dla każdego użytkownika, na przykład identyfikator sesji, nazwę użytkownika lub identyfikator użytkownika.

Atak jednym kliknięciem ma miejsce, gdy osoba atakująca utworzy stronę internetową (.htm lub .aspx) zawierającą ukryte pole formularza o nazwie __VIEWSTATE, które jest już wypełnione danymi ViewState. ViewState można wygenerować ze strony wcześniej utworzonej przez atakującego, takiej jak strona koszyka na zakupy zawierająca 100 elementów. Atakujący zwabia niczego niepodejrzewającego użytkownika do przeglądania strony, a następnie atakujący powoduje wysłanie strony na serwer, na którym poprawne jest ViewState. Serwer nie może wiedzieć, że ViewState pochodzi od atakującego. Sprawdzanie poprawności ViewState i HMAC nie przeciwdziałają temu atakowi, ponieważ ViewState jest prawidłowy, a strona jest wykonywana w kontekście bezpieczeństwa użytkownika.

Ustawiając właściwość ViewStateUserKey, gdy osoba atakująca przejdzie do strony w celu utworzenia ViewState, właściwość jest inicjowana na swoje imię. Gdy uprawniony użytkownik prześle stronę na serwer, zostaje ona zainicjowana nazwą atakującego. W rezultacie sprawdzenie ViewMate HMAC kończy się niepowodzeniem i generowany jest wyjątek.


2
Pamiętaj również, aby opuścić bazę.OnInit (e); aby funkcja Page_Init () wykonała swoje zadanie.
Druid

Myślę, że ta sztuczka może się nie powieść, jeśli prawdziwy użytkownik nie zaakceptuje plików cookie lub jeśli sessionid ma limit czasu.
Aristos

1
Nie potrzebujesz, base.OnInit(e);jeśli używasz AutoEventWireup="true"strony.
Adam Nofsinger

1
Druid: Nie zastępuje OnInit (w takim przypadku konieczne byłoby base.OnInit (e)).
crdx

Używanie identyfikatora sesji dla ViewStateUserKey działa tylko po faktycznym rozpoczęciu sesji. Oznacza to również, że strony te mogą przekroczyć limit czasu po zakończeniu sesji. W przypadkach, w których problemy te dotyczą, możesz rozważyć użycie czegoś bardziej trwałego, na przykład adresu IP użytkownika.
RickNZ


20

Zawarte w ASP.NET 3.5 SP1:

  • customErrors obsługuje teraz atrybut „redirectMode” o wartości „ResponseRewrite”. Pokazuje stronę błędu bez zmiany adresu URL.
  • Tag formularza rozpoznaje teraz atrybut akcji. Idealne, gdy używasz przepisywania adresów URL

20

Właściwość DefaultButton w panelach.

Ustawia domyślny przycisk dla określonego panelu.


1
Uwaga, nie działa na wszelkiego rodzaju przyciskach, np. LinkButtons!
Kovu


19

Używanie configSource do dzielenia plików konfiguracyjnych.

Możesz użyć atrybutu configSource w pliku web.config, aby wypchnąć elementy konfiguracji do innych plików .config, na przykład zamiast:

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

... możesz mieć całą sekcję appSettings zapisaną w innym pliku konfiguracyjnym. Oto nowe web.config:

    <appSettings configSource="myAppSettings.config" />

myAppSettings.configPliku:

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

Jest to bardzo przydatne w scenariuszach, w których wdrażasz aplikację na kliencie i nie chcesz, aby ingerował w sam plik web.config i po prostu chciał, aby mogli zmienić tylko kilka ustawień.

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


1
Działa to również w przypadku dowolnego typu projektu .net, np. Aplikacja komputerowa. configs
Zoltan Veres



16

Domyślnie każda zawartość między znacznikami dla formantu niestandardowego jest dodawana jako formant podrzędny. Można to przechwycić w przesłonięciu AddParsedSubObject () w celu filtrowania lub dodatkowej analizy (np. Zawartości tekstu w 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

Jeśli program ASP.NET generuje kanał RSS, czasami umieści dodatkowy wiersz na górze strony. To nie sprawdza się w przypadku popularnych walidatorów RSS. Możesz obejść ten problem, umieszczając dyrektywę strony <@Page>na dole strony.


7
Czy nie lepiej byłoby użyć programu .ASHX do generowania kanałów RSS?
Dan Diplo

Myślę, że to zależy od złożoności projektu. Nie każdy ma zdolność lub umiejętności do tworzenia i kompilowania programów obsługi. Na stronie asp.net działa do tego całkiem dobrze
Kevin Goff,

1
I możesz użyć czegoś takiego jak <asp: Repeater> do generowania elementów RSS i robienia innych sztuczek (takich jak używanie LogInView do usuwania niektórych elementów), co jest znacznie lepsze niż pisanie ciągów z ASHX IMO
chakrit

LinqToXml + ASHX to najlepsza droga!
Carlos Muñoz

Jest to przydatne do znacznie więcej niż generowania kanału RSS. IIRC, HTML5 musi mieć znacznik <! Doctype html> w pierwszym wierszu u góry, aby poprawnie sprawdzić poprawność.
Roy Tinker,

12

Przed dodaniem tras przez program ASP.NET v3.5 można utworzyć własne przyjazne adresy URL, pisząc moduł HTTP i przepisując żądanie na początku potoku strony (np. Zdarzenie BeginRequest).

Adresy URL takie jak http: // nazwa_serwera / strona / Param1 / SomeParams1 / Param2 / SomeParams2 zostaną zmapowane na inną stronę, jak poniżej (często przy użyciu wyrażeń regularnych).

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

DotNetNuke ma naprawdę dobry HttpModule, który robi to dla swoich przyjaznych adresów URL. Nadal jest przydatny na komputerach, na których nie można wdrożyć .NET v3.5.


Wymaga to mapowania wszystkich żądań IIS do ASP.NET
John Sheehan,

Lub po prostu program obsługi błędów 404.
FlySwat
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.