Recursos ocultos do ASP.NET [fechado]

292

Esta pergunta existe porque tem significado histórico, mas não é considerada uma boa pergunta específica para este site, portanto, não a use como evidência de que você pode fazer perguntas semelhantes aqui.

Mais informações: https://stackoverflow.com/faq


Sempre existem recursos que seriam úteis em cenários marginais, mas por esse motivo a maioria das pessoas não os conhece. Estou solicitando recursos que normalmente não são ensinados pelos livros didáticos.

Quais são os que você conhece?

Vaibhav
fonte
Boa pergunta, eu gostaria de poder votar várias vezes!
Gavin Miller
1
Acordado. Eu amo tópicos como este. Há tanta profundidade na estrutura que às vezes você se surpreende com coisas que nunca soube que existiam.
214 Deane
Estou aprendendo muitos truques interessantes com as respostas neste tópico - obrigado! :)
Maxim Zaslavsky
16
Em vez de "Recursos ocultos de ..", essas coisas não devem ser nomeadas "Recursos pouco conhecidos de .." porque quase todas as respostas estão bem documentadas no MSDN ou em outro local, mas não são conhecidas ou usadas com frequência.
John K
Consulte meta.stackexchange.com/questions/56669/… , meta.stackexchange.com/questions/57226/… , e postagens relacionadas do Meta para discussão sobre adequação e fechamento.

Respostas:

335

Durante o teste, você pode enviar e-mails para uma pasta no seu computador em vez de para um servidor SMTP. Coloque isso no seu web.config:

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
        </smtp>
    </mailSettings>
</system.net>
John Sheehan
fonte
6
Realmente? Eu estava prestes a instalar um servidor SMTP falso, como o Dumbster. Eu escondi jóia.
Eduardo Molteni
2
Alguém sabe se você pode especificar um compartilhamento UNC para o local do diretório?
Mark Sherretta
32
Melhor ainda, coloque isso no seu dev box machine.config, para que você não precise alterar o web.config em todos os aplicativos criados.
Max Toro
Você pode configurá-lo para que ele faça isso apenas no host local? Dessa forma, você não precisa mudar isso toda vez?
Ch122
Não há configuração para isso. Você vai ter de gerir as diferenças de configuração utilizando outros métodos (projetos web de implantação, tarefas de construção, etc.)
John Sheehan
210

Se você colocar um arquivo chamado app_offline.htm na raiz de um diretório de aplicativo Web, o ASP.NET 2.0+ encerrará o aplicativo e interromperá o processamento normal de novas solicitações de entrada para esse aplicativo, mostrando apenas o conteúdo do app_offline.htm arquivo para todos os novos pedidos .

Essa é a maneira mais rápida e fácil de exibir o aviso "Site temporariamente indisponível" enquanto reimplanta (ou reverte) alterações em um servidor de produção.

Além disso, conforme indicado pela marxidad , verifique se você possui pelo menos 512 bytes de conteúdo no arquivo para que o IE6 o processe corretamente.

Troy DeMonbreun
fonte
10
Não se esqueça da solução alternativa para as mensagens "amigáveis" do IE: tinyurl.com/app-offline-friendly
Mark Cidade
1
Ai! Tenha cuidado ao usar isso com o MOSS 2007. Ele funcionará apenas para páginas que foram acessadas desde a última reinicialização do IIS. Então, se você adicionar esta página à sua raiz virtual wss, em seguida, tentar abrir uma página que não foram acessados anteriormente, você receberá um 404.
Marc
1
@ Marc - Recebi esta dica de Scott Guthrie, se você estiver se sentindo generoso, ajudaria muitos desenvolvedores do SharePoint a evitar esse cenário se comentasse o artigo do Gu: weblogs.asp.net/scottgu/archive/2005/10/ 06 / 426755.aspx
Troy DeMonbreun
Além disso, isso também acionará uma reciclagem do Domínio do Aplicativo e fechará todas as conexões de banco de dados abertas, depois que todas as solicitações forem concluídas.
Bart Verkoeijen
Há uma ressalva: o IIS retorna o conteúdo app_offline.htm com um código de status HTTP 404. Se um mecanismo de pesquisa vagar e tentar indexar seu site enquanto estiver nesse modo offline, talvez você não aprecie os resultados. Mas funciona muito bem para meu aplicativo Web corporativo particular!
Larry Silverman
119
throw new HttpException(404, "Article not found");

Isso será detectado pelo ASP.NET, que retornará a página customErrors. Aprendi sobre este em uma dica recente do .NET Tip of the Day

John Sheehan
fonte
Alguns desenvolvedores podem argumentar que é melhor encerrar as coisas manualmente no HttpContext.Response, em vez de lançar uma exceção que é uma operação bastante cara nos livros do .NET.
1189868 #
Não é esta má forma? Você está mostrando o erro 404, enquanto deseja exibir um erro / exceção.
1013 Donnie Thomas
1
Um caso em que consigo pensar é que se alguém está mexendo maliciosamente com parâmetros e coloca algo inválido, você provavelmente quer um 404 genérico, não um erro específico.
John Sheehan
3
Votado apenas porque agora estou ciente do site .NET Tip of the Day.
Kon
ele só funciona quando você joga-lo em httpModule ou httpHandler
Khaled Musaied
75

Aqui está o melhor. Adicione isso ao seu web.config para uma compilação MUITO mais rápida. Isto é pós 3.5SP1 através deste QFE .

<compilation optimizeCompilations="true">

Resumo rápido: estamos introduzindo uma nova opção optimizeCompilations no ASP.NET que pode melhorar bastante a velocidade de compilação em alguns cenários. Existem algumas capturas, então continue lendo para mais detalhes. Essa opção está atualmente disponível como QFE para 3.5SP1 e fará parte do VS 2010.

O sistema de compilação do ASP.NET adota uma abordagem muito conservadora, o que faz com que ele elimine qualquer trabalho anterior realizado sempre que um arquivo de 'nível superior' for alterado. Os arquivos de 'nível superior' incluem qualquer coisa no bin e App_Code, além de global.asax. Embora isso funcione bem para aplicativos pequenos, torna-se quase inutilizável para aplicativos muito grandes. Por exemplo, um cliente estava encontrando um caso em que demorava 10 minutos para atualizar uma página depois de fazer qualquer alteração em uma montagem de 'compartimento'.

Para aliviar a dor, adicionamos um modo de compilação "otimizado", que adota uma abordagem muito menos conservadora da recompilação.

Via aqui :

Scott Hanselman
fonte
6
Isso está "ativado por padrão" no VS 2010 ou ainda devo testá-lo?
M4N
73
  • HttpContext.Current sempre lhe dará acesso à Solicitação / Resposta / etc. Do contexto atual, mesmo quando você não tiver acesso às propriedades da Página (por exemplo, de uma classe auxiliar fracamente acoplada).

  • Você pode continuar executando o código na mesma página após redirecionar o usuário para outro chamando Response.Redirect ( url , false )

  • Você não precisa de arquivos .ASPX se tudo o que você deseja é uma página compilada (ou qualquer IHttpHandler ). Basta definir o caminho e os métodos HTTP para apontar para a classe no <httpHandlers>elemento no arquivo web.config.

  • Um objeto Page pode ser recuperado de um arquivo .ASPX programaticamente chamando PageParser.GetCompiledPageInstance (virtualPath, aspxFileName, Context)

Mark Cidade
fonte
Sobre Response.Redirect (url, false) - Isso é tanto o que eu esperava por muito tempo .. Eu não sei como eu perdi isso, mas thanxxx
Subliminal Hash
1
Alguém pode explicar o que você faria com isso? Eu sei que tem algum valor, mas eu não consigo descobrir o porquê ...
Deane
5
Se você deseja redirecionar o usuário para um endereço diferente, mas ainda tem algum processamento de back-end (por exemplo, uma solicitação de geração de relatório que redireciona para a página de status de geração do relatório enquanto continua a gerar o relatório em segundo plano)
Mark Cidade
Alguém pode explicar uma situação útil para PageParser.GetCompiledPageInstance (..)? Os documentos dizem que é para uso da infraestrutura - ele retorna um tipo IHttpHandler para que eu não veja como ele pode ser usado na prática.
John K
@jdk: Eu o usei no passado ao substituir o manipulador padrão para solicitações * .aspx, para que eu possa usar objetos IHttpHandler dinâmicos na memória, mas também use GetCompiledPageInstance () para arquivos físicos * .aspx.
Mark Cidade
70

Modo de varejo no nível machine.config:

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

Substitui as configurações web.config para forçar a depuração para false, ativa erros personalizados e desativa o rastreamento. Não é mais necessário mudar os atributos antes da publicação - basta deixá-los todos configurados para ambientes de desenvolvimento ou teste e atualizar a configuração de varejo de produção.

Troy Hunt
fonte
1
Às vezes, esqueço de alterar a depuração da compilação para false antes da publicação, o que afeta negativamente o desempenho. Não há mais problema!
Roy Tinker
59

Ativando intellisense para MasterPages nas páginas de conteúdo
Tenho certeza de que este é um hack muito pouco conhecido

Na maioria das vezes, você precisa usar o método findcontrol e converter os controles na página mestre das páginas de conteúdo quando quiser usá-las, o MasterType diretiva permitirá o intellisense no visual studio assim que você fizer isso.

basta adicionar mais uma diretiva à página

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

Se você não quiser usar o Caminho Virtual e, em vez disso, usar o nome da classe,

<%@ MasterType TypeName="MyMainMasterPage" %>

Veja o artigo completo aqui

Binoj Antony
fonte
Às vezes, o uso do FindControl pode ser agitado, obrigado por esta ótima dica!
Alexandre Brisebois
4
Usar isso pode resultar em comportamento inesperado. Veja stackoverflow.com/questions/1998931/…
citronas
Pessoalmente, acho que o recurso deve ser deixado desconhecido para as pessoas, ele acopla a página à página principal. Se você acabar usando as propriedades / métodos da página principal e, em seguida, alterá-la, você terá um pesadelo de manutenção.
Phill
@ Phil: Às vezes é necessário e ter um acesso estaticamente digitado a uma masterpage é muito melhor do que a abordagem FindControl. Pelo menos você recebe a mensagem do compilador e pode corrigi-la rapidamente.
Durden81
58

HttpContext.Items como uma ferramenta de cache no nível de solicitação

John Sheehan
fonte
2
Esse também seria o meu ponto, eu uso isso em controles aninhados para passar / receber informações de nível de solicitação. Também usei isso no MVC para armazenar uma lista de arquivos js a serem anexados, com base em visualizações parciais.
Tracker1
1
Eu uso isso quando uso o roteamento asp.net para passar os parâmetros buscados dos URLs para minhas páginas. (não com MVC), ótimo para reescrever URLs e é bastante flexível.
Alexandre Brisebois
Hmmmm, pensei em algum lugar onde eu poderia ter usado isso em vez de Session - ta!
Mike Kingscott
52

Duas coisas se destacam na minha cabeça:

1) Você pode ativar e desativar o Trace no código:

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

2) Você pode criar várias páginas .aspx usando apenas um arquivo "code-behind" compartilhado.

Crie um arquivo .cs de classe:

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

e, em seguida, você pode ter qualquer número de páginas .aspx (depois de excluir o código .designer.cs e .cs por trás do código gerado pelo 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>

Você pode ter controles no ASPX que não aparecem na Classe1 e vice-versa, mas é necessário lembrar-se de verificar se há nulos nos seus controles.

Radu094
fonte
Eu teria votado nisso, mas ficou sem votos. Vou tentar me lembrar de voltar para votar. Eu não sabia que poderíamos ter o mesmo arquivo do Code Behind para várias páginas. Não tenho certeza, como isso funcionaria.
Vaibhav
5
Alguém mais acha que é um risco de segurança permitir que você ative um rastreamento a partir de um URL? (# 1) Não vou rebaixar esta questão, mas é importante entender o risco lá.
Kevin Goff
5
Absolutelly, você deve realmente colocar esse código em um DEBUG #ifdef #endif bloco
Radu094
Ótimos comentários, apontando o aspecto de segurança.
Vaibhav
2
Por que é um risco de segurança ativar um rastreamento a partir do URL? Como pode ser usado para me prejudicar?
Kamarey
48

Você pode usar:

 Request.Params[Control.UniqueId] 

Para obter o valor de um controle ANTES do viewstate ser inicializado (Control.Text etc estará vazio neste momento).

Isso é útil para o código no Init.

FlySwat
fonte
A inicialização do Viewstate não trata com Request.Params. Use-o ANTES de criar o método LoadPostData do controle implementado IPostBackDataHandler.
chapluck
46

WebMethods.

Você pode usar retornos de chamada do ASP.NET AJAX para métodos da Web colocados em páginas ASPX. Você pode decorar um método estático com os atributos [WebMethod ()] e [ScriptMethod ()]. Por exemplo:

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

Agora, na sua página ASPX, você pode fazer isso:

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

E chame seu método do lado do servidor via JavaScript usando:

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

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

Verifique se o cliente ainda está conectado, antes de iniciar uma tarefa de longa execução:

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

Um recurso pouco conhecido e raramente usado do ASP.NET é:

Mapeamento de tags

Raramente é usado porque há apenas uma situação específica em que você precisa, mas quando precisa, é muito útil.

Alguns artigos sobre esse recurso pouco conhecido:

Mapeamento de tags no ASP.NET
usando o mapeamento de tags no ASP.NET 2.0

e desse último artigo:

O mapeamento de tags permite que você troque controles compatíveis em tempo de compilação em todas as páginas do seu aplicativo da web. Um exemplo útil é se você possui um controle ASP.NET padrão, como um DropDownList, e deseja substituí-lo por um controle personalizado derivado do DropDownList. Pode ser um controle personalizado para fornecer armazenamento em cache mais otimizado dos dados de pesquisa. Em vez de editar todos os formulários da Web e substituir as DropDownLists incorporadas por sua versão personalizada, você pode fazer com que o ASP.NET efetue isso modificando o web.config:

<pages>
 <tagMapping>
   <clear />
   <add tagType="System.Web.UI.WebControls.DropDownList"
        mappedTagType="SmartDropDown"/>
  </tagMapping>
</pages>
CraigTP
fonte
Isso seria muito confuso para outros desenvolvedores da sua equipe
Aykut Akıncı
1
@ Aykut - De fato, poderia ser, e é por isso que afirmo que sua utilidade é bastante estreita, no entanto, quando necessário, é muito útil. Além disso, eu garantiria que qualquer uso do Mapeamento de tags fosse documentado com muita clareza para evitar confusão e ambiguidade.
CraigTP
43

HttpModules . A arquitetura é louca e elegante. Talvez não seja um recurso oculto, mas interessante mesmo assim.

Allain Lalonde
fonte
3
HttpModules é algo avançado, mas eu não chamaria isso de raro ou menos usado (ou me chamaria de ingênuo). Mas sim, eu amo a arquitetura.
Vaibhav
+1 porque muitos desenvolvedores experientes podem conhecer os HttpModules, mas não entendem completamente sua relação com as solicitações. (O mesmo acontece com o HttpHandlers)
John Bubriski
34

Você pode usar Comentários do ASP.NET em uma página .aspx para comentar partes completas de uma página, incluindo controles de servidor. E o conteúdo comentado nunca será enviado ao cliente.

<%--
    <div>
        <asp:Button runat="server" id="btnOne"/>
    </div>
--%>
Chris Pietschmann
fonte
5
Existem pessoas que realmente não sabem que existem comentários?
Joe Phillips
7
Eu gosto quando você encontrar meia página aspx em <! - comentários ...
Bryan Rehbein
É bastante recurso nua de ASP.NET
rafek
34

O construtor de expressões de código

Exemplo de marcação:

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

A verdadeira beleza do construtor de expressões de código é que você pode usar a ligação de dados como expressões em situações que não são de ligação de dados. Você também pode criar outros Construtores de Expressões que executam outras funções.

web.config:

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

A classe cs que faz tudo acontecer:

[ExpressionPrefix("Code")]
public class CodeExpressionBuilder : ExpressionBuilder
{
    public override CodeExpression GetCodeExpression(
        BoundPropertyEntry entry,
        object parsedData,
        ExpressionBuilderContext context)
    {            
        return new CodeSnippetExpression(entry.Expression);
    }
} 
andleer
fonte
1
o que você quer dizer com "e outros" no título?
Khaled Musaied
Bem, acho que nunca cheguei aos outros.
andleer
2
+1, muito legal característica ... Isso é realmente muito semelhante à extensões de marcação do WPF
Thomas Levesque
não é o mesmo que usar <%= /*code*/ %>?
Bevacqua
33

Uso do tipo de arquivo ASHX:
se você deseja apenas alguns html ou xml básicos sem passar pelos manipuladores de eventos da página, poderá implementar o HttpModule de uma maneira simples

Nomeie a página como SomeHandlerPage.ashx e apenas coloque o código abaixo (apenas uma linha) nela

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

Então o arquivo de código

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; }
        }
    }
}
Binoj Antony
fonte
5
Vale a pena notar que você deve adicionar IRequiresSessionState ou IReadOnlySessionState se precisar, caso contrário, ele não estará lá.
Tracker1 23/05/09
3
Também é importante notar que você pode especificar a configuração do manipulador no web.config para não precisar de um arquivo ashx físico. Ou você pode registrar o manipulador programaticamente no início do seu aplicativo no asax global.
Phill
27

Definindo propriedades de controle do servidor com base no navegador de destino e muito mais .

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

Aquele meio que me pegou de surpresa.

Omer van Kloeten
fonte
1
+1. Você pode postar um exemplo de código curto embutido. Eu acho que vai gerar mais atenção e votos. Eu quero que este suba.
John K
26

Eu trabalhei em um aplicativo asp.net que passou por uma auditoria de segurança por uma empresa líder em segurança e aprendi esse truque fácil para evitar uma vulnerabilidade de segurança menos conhecida, mas importante.

A explicação abaixo é de: http://www.guidanceshare.com/wiki/ASP.NET_2.0_Security_Guidelines_-_Parameter_Manipulation#Consider_Using_Page.ViewStateUserKey_to_Counter_One-Click_Attacks

Considere usar o Page.ViewStateUserKey para combater ataques de um clique. Se você autenticar seus chamadores e usar o ViewState, defina a propriedade Page.ViewStateUserKey no manipulador de eventos Page_Init para impedir ataques com um clique.

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

Defina a propriedade com um valor que você sabe que é exclusivo para cada usuário, como um ID de sessão, nome de usuário ou identificador de usuário.

Um ataque com um clique ocorre quando um invasor cria uma página da Web (.htm ou .aspx) que contém um campo de formulário oculto chamado __VIEWSTATE que já está preenchido com os dados do ViewState. O ViewState pode ser gerado a partir de uma página criada anteriormente pelo invasor, como uma página de carrinho de compras com 100 itens. O invasor atrai um usuário desavisado para navegar até a página e, em seguida, o invasor faz com que a página seja enviada ao servidor em que o ViewState é válido. O servidor não tem como saber que o ViewState se originou do invasor. A validação do ViewState e os HMACs não contrariam esse ataque porque o ViewState é válido e a página é executada no contexto de segurança do usuário.

Ao definir a propriedade ViewStateUserKey, quando o invasor navega para uma página para criar o ViewState, a propriedade é inicializada com seu nome. Quando o usuário legítimo envia a página ao servidor, ela é inicializada com o nome do invasor. Como resultado, a verificação do ViewState HMAC falha e uma exceção é gerada.

Craig McKeachie
fonte
2
Lembre-se também de deixar base.OnInit (e); para que a função Page_Init () faça seu trabalho.
Druid
Eu acho que esse truque pode falhar se um usuário real não aceitar cookies ou se o sessionid tiver tempo limite.
Aristos #
1
Você não precisa base.OnInit(e);se estiver usando AutoEventWireup="true"a página.
Adam Nofsinger
1
Druida: Ele não está substituindo OnInit (nesse caso, base.OnInit (e) seria necessário).
crdx
O uso do ID da sessão para o ViewStateUserKey só funciona após o início de uma sessão. Isso também significa que essas páginas podem expirar após o término da sessão. Nos casos em que esses problemas são preocupantes, considere usar algo mais durável, como o endereço IP do usuário.
RickNZ
25

HttpContext.Current.IsDebuggingEnabled

Isso é ótimo para determinar quais scripts serão exibidos (versões mínimas ou completas) ou qualquer outra coisa que você possa querer no dev, mas não ao vivo.

John Sheehan
fonte
Concordo com Jan, mas às vezes pode ser interessante ter um aplicativo que esteja ciente de seu estado de execução, Debug / Release.
Alexandre Brisebois
20

Incluído no ASP.NET 3.5 SP1:

  • agora customErrors suporta o atributo "redirectMode" com o valor "ResponseRewrite". Mostra a página de erro sem alterar o URL.
  • A tag do formulário agora reconhece o atributo action. Ótimo para quando você estiver usando a reescrita de URL
John Sheehan
fonte
20

Propriedade DefaultButton nos painéis.

Ele define o botão padrão para um painel específico.

MRG
fonte
1
Atenção, não funciona em todos os tipos de botões, por exemplo, LinkButtons!
Kovu
19

Usando configSource para dividir arquivos de configuração.

Você pode usar o atributo configSource em um arquivo web.config para enviar elementos de configuração para outros arquivos .config, por exemplo, em vez de:

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

... você pode ter toda a seção appSettings armazenada em outro arquivo de configuração. Aqui está o novo web.config:

    <appSettings configSource="myAppSettings.config" />

O myAppSettings.configarquivo:

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

Isso é bastante útil para cenários em que você implanta um aplicativo em um cliente e não deseja que ele interfira no próprio arquivo web.config e apenas deseja que eles possam alterar apenas algumas configurações.

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

Ryan Shripat
fonte
1
Isso também está funcionando em qualquer tipo de projeto .net, por exemplo, o aplicativo Desktop. configs
Zoltan Veres
17

Atributo MaintainScrollPositionOnPostback na diretiva Page. É usado para manter a posição de rolagem da página aspx entre as postagens.

MRG
fonte
1
Um comentário seria útil para melhorar a resposta.
8/09/09 da MRG
16

HttpContext.IsCustomErrorEnabled é um recurso interessante. Eu achei útil mais de uma vez. Aqui está um pequeno post sobre isso.

Kilhoffer
fonte
16

Por padrão, qualquer conteúdo entre as tags para um controle personalizado é adicionado como um controle filho. Isso pode ser interceptado em uma substituição AddParsedSubObject () para filtragem ou análise adicional (por exemplo, do conteúdo de texto em 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>
Mark Cidade
fonte
13

Se você tiver o ASP.NET gerando um feed RSS, ele às vezes colocará uma linha extra na parte superior da página. Isso não será validado com validadores comuns de RSS. Você pode contornar isso colocando a diretiva de página <@Page>na parte inferior da página.

Kevin Goff
fonte
7
Você não faria melhor usando um manipulador .ASHX para gerar feeds RSS?
21119 Dan Diplo
Eu acho que isso depende da complexidade do projeto. Nem todo mundo tem a capacidade ou habilidades para criar e compilar manipuladores. Na página asp.net funciona razoavelmente bem para isso
Kevin Goff
1
E você pode usar algo como <asp: Repeater> para gerar itens RSS e fazer outros truques (como usando o LoginView para remover alguns itens) que é muito melhor do que escrever seqüências de ASHX IMO
chakrit
LinqToXml + ASHX é o caminho a seguir!
Carlos Muñoz
Isso é útil para muito mais que a geração de feeds RSS. IIRC, o HTML5 deve ter a tag <! Doctype html> na primeira linha na parte superior para validar corretamente.
Roy Tinker
12

Antes que o ASP.NET v3.5 adicionasse rotas, você poderia criar seus próprios URLs amigáveis ​​simplesmente escrevendo um HTTPModule e reescrevendo a solicitação no início do pipeline da página (como o evento BeginRequest).

URLs como http: // nome_do_servidor / página / Param1 / SomeParams1 / Param2 / SomeParams2 seriam mapeados para outra página como abaixo (geralmente usando expressões regulares).

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

O DotNetNuke tem um HttpModule realmente bom que faz isso por seus URLs amigáveis. Ainda é útil para máquinas nas quais você não pode implantar o .NET v3.5.

Tyler
fonte
Isso requer o mapeamento de todas as solicitações do IIS para ASP.NET
John Sheehan
Ou apenas o manipulador de erros 404.
FlySwat 21/02/09