Pergunta

Por que eu tenho para especificar runat="server" em todos os meus controles ASP.NET quando é um atributo obrigatório e server é a única opção disponível no meu conhecimento limitado de ASP.NET, e eu recebo um erro se eu não fizer uso -lo?

Eu entendo que eu posso opcionalmente usá-lo em minhas tags HTML, e eu entendo o paradigma cliente / servidor e para que é realmente especificando.

É um tag redundante que só poderia ser implicado pelo controle sendo um controle ASP.NET, ou há uma razão subjacente?

Foi útil?

Solução

Eu sempre acreditei que estava lá mais para a compreensão de que você pode misturar tags ASP.NET e tags HTML e tags HTML têm a opção de runat="server" sendo ou não. Não dói nada para deixar a tag, e isso faz com que um erro do compilador para tirá-lo. Quanto mais coisas você implicam sobre a linguagem web, menos é fácil para um programador de brotamento para entrar e aprender. Que é tão bom uma razão como qualquer ser detalhado sobre os atributos de marca.

Esta conversa foi teve sobre Mike Schinkel Blog entre ele e Talbot Crowell da Microsoft Serviços Nacionais. A informação relevante é inferior (primeiro parágrafo parafraseado devido a erros gramaticais em fonte):

[...] , mas a importância da <runat="server"> é mais para a consistência e extensibilidade.

Se o desenvolvedor tem que marcar algumas tags (viz. <asp: />) para o motor ASP.NET ignorar, então há também o potencial problema de conflitos de namespace entre tags e melhorias futuras. Ao exigir o atributo <runat="server">, este é negada.

Ele continua:

Se <runat=client> foi exigido para todas as marcas do lado do cliente, o analisador seria necessário analisar todas as tags e retirar a parte <runat=client>.

Ele continua:

Atualmente, Se meu palpite estiver correto, o analisador simplesmente ignora todo o texto (tags ou nenhuma etiquetas) a menos que seja uma tag com o atributo runat=server ou um “<%” prefixo ou ssi “<!– #include ... (...) Além disso, como ASP.NET é projetado para permitem a separação dos web designers (Foo.aspx) dos desenvolvedores web (Foo.aspx.vb), a web designers podem usar suas próprias ferramentas web designer para lugar HTML e JavaScript do lado cliente sem ter de saber sobre ASP.NET tags ou atributos específicos.

Outras dicas

Normalmente, eu não gosto de palpite, mas eu vou em um presente ...

Se você se lembrar .NET comercialização campanha publicitária para trás da Microsoft no dia (2001?), Era difícil dizer o que .NET mesmo era. Era um servidor? uma plataforma de programação? uma linguagem? algo totalmente novo? Dado os anúncios, era ambígua qualquer coisa que você queria que fosse -. Ele só resolvido qualquer problema que possa ter

Então, meu palpite é que havia uma grande visão oculta que o código ASP.NET poderia funcionar em qualquer lugar - do lado do servidor ou do lado do cliente, em uma cópia do Internet Explorer ligada ao .NET runtime. runat = "server" é apenas um vestígio remanescente, deixou para trás porque é do lado do cliente equivalente nunca fez isto a produção.

Lembre-se daqueles anúncios estranhas?

relacionadas: artigo do The Register com alguma história .NET .

Nem todos os controles que podem ser incluídos em uma página deve ser executado no servidor. Por exemplo:

<INPUT type="submit" runat=server />

Este é essencialmente o mesmo que:

<asp:Button runat=server />

Remova a tag runat = servidor a partir do primeiro e você tem um botão HTML padrão que é executado no navegador. Há razões a favor e contra a execução de um determinado controle no servidor, e não há nenhuma maneira para ASP.NET "assumir" o que você quer baseado no HTML markup você incluir. Pode ser possível "inferir" do runat = servidor para a família <asp:XXX /> de controles, mas meu palpite é que a Microsoft iria considerar que um hack para a sintaxe de marcação e motor ASP.NET.

Microsoft MSDN artigo Os controles esquecido: Controles HTML Servidor explica uso de runat = "server" com um exemplo na caixa de texto <input type="text">, convertendo-a <input type="text" id="Textbox1" runat="server">

Fazendo isso vai dar-lhe acesso programático ao elemento HTML em o servidor antes que a página Web é criada e enviada para o cliente. O elemento HTML deve conter um atributo id. Este atributo serve como uma identidade para o elemento e permite aos elementos por suas identificações específicas. Além deste atributo, o elemento HTML deve conter runat = "server". Isso informa ao servidor de processamento que o tag é processado no servidor e não deve ser considerado um elemento HTML tradicional.

Em suma, para permitir o acesso programático ao runat="server" elemento HTML adicionar a ele.

Minha suspeita é que isso tem a ver com a forma como os controles do lado do servidor são identificados durante o processamento. Ao invés de ter que verificar todos os controles em tempo de execução pelo nome para determinar se o processamento do lado do servidor precisa ser feito, ele faz uma seleção na representação nó interno por tag. O compilador verifica para se certificar de que todos os controles que exigem tags do servidor tê-los durante a fase de validação.

elementos HTML em arquivos ASP.NET são, por padrão, tratado como texto. Para tornar estes elementos programáveis, adicione um atributo runat="server" ao elemento HTML. Este atributo indica que o elemento deve ser tratado como um controle de servidor.

É lá porque todos os controles em ASP .NET herdar de System.Web.UI.Control que tem o atributo "runat".

no System.Web.UI.HTMLControl classe, o atributo não é necessário, no entanto, na classe System.Web.UI.WebControl é exigido o atributo.

Editar: Deixe-me ser mais específico. desde que asp.net é praticamente um resumo de HTML, o compilador precisa de algum tipo de directiva para que ele saiba que tag específica precisa ser executado no lado do servidor. Se esse atributo não estava lá, então, é não saberia para processá-lo no servidor pela primeira vez. se ele não estiver lá, ele assume que é marcação regular e passa-lo para o cliente.

Eu acho que a Microsoft pode corrigir essa ambiguidade, fazendo o suplemento compilador runat atributo antes que a página é já compilado, algo como a coisa tipo-apagamento que java tem com os genéricos, em vez de apagar, ele poderia estar escrevendo runat = server onde quer que ela vê asp:. prefixo para tags, de modo que o desenvolvedor não precisa se preocupar com isso

Se você usá-lo em tags HTML normais, isso significa que você pode programaticamente manipulá-los em manipuladores de eventos etc, por exemplo, mudar a href ou classe de um marca de âncora no carregamento da página ... só faça isso se você tem que, porque etiquetas de baunilha html ir mais rápido.

Quanto controles de usuário e controles de servidor, não, eles trabalham apenas não sem eles, sem ter investigou as entranhas do pré-processador aspx, não poderia dizer exatamente o porquê, mas levaria um palpite de que para, provavelmente, boas razões, eles só escreveu o analisador dessa forma, à procura de coisas explicitamente marcadas como "fazer algo".

Se @JonSkeet é em torno de qualquer lugar, ele irá provavelmente ser capaz de fornecer uma resposta muito melhor.

Ao enviar os dados para o servidor ASP.NET Web os controles mencionados como Runat = “server” será representado como objetos Dot Net em Application Server. Você pode digitar manualmente o código em controles HTML ou então pode usar Executar como Servidor opção clicando com o botão direito na vista de estrutura. controles ASP.NET irá receber automaticamente este atributo depois de arrastá-lo da caixa de ferramentas, onde geralmente controles HTML não.

atributo Bonita redundante, considerando a tag "asp" é, obviamente, um elemento ASP e deve ser suficiente para identificá-lo como um elemento acessível do lado do servidor.

Em outros lugares no entanto, usado para elevar as tags normais para ser usado no código-behind.

Eu só vim a esta conclusão por tentativa e erro: runat = "server" é necessária para acessar os elementos em tempo de execução no lado do servidor. Removê-los, recompilação e veja o que acontece.

runat="Server" indica um postback para o servidor irá ocorrer para o HTML "controle".

Web Forms usar postback constantemente para sinalizar o servidor para processar um evento de controle da página.

páginas .NET MVC NÃO use postback (exceto por uma "submit" formulário). MVC depende JQUERY para gerenciar a página no lado do cliente (ignorando assim a necessidade de um monte de mensagens postback para o servidor).

Assim: .NET Web Forms ... uso atributo "runat" muito na marcação da página.

.NET MVC quase nunca usa atributo "runat" na marcação da página.

Espero que isso ajuda a esclarecer por que runat é necessário ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top