2009-01-15 25 views
18

Algunos textos en ASP.NET MVC indican que "no hay etiquetas de servidor runat", incluso este artículo de MSDN dice esto, cuando, justo encima de esa declaración hay un ejemplo de código con una etiqueta de servidor runat en el elemento HEAD:¿Cuál es el estado de las etiquetas runat = "server" en ASP.NET MVC?

Y en conversaciones StackOverflow leí

"El hecho de que desea utilizar "controles runat = server" significa que debería estar haciendo una aplicación ASP.NET tradicional.

Y, por supuesto, en la página Site.Master hay atributos de servidor runat en ContentPlaceHolders.

Lo único que veo ausente de ASP.NET MVC en términos de servidor runat es la omnipresente etiqueta FORMATO = "servidor" en cada página/vista .aspx.

Pero, ¿qué pasa con el resto de las etiquetas de servidor runat en ASP.NET MVC, qué quiere decir la gente cuando dice que ASP.NET MVC no las tiene?

Respuesta

7

Si utiliza una etiqueta runat = "server" en cualquier elemento, como un DIV que dejará sin efecto dicha código como un método separado en la página compilada.

Si está convirtiendo código 'heredado', es una buena idea eliminar todas las etiquetas runat desde el principio, de lo contrario terminará en una situación en la que un código como el siguiente le da un error.

<% foreach (var cat in cats) { %> 
    <div runat="server"> 
     <span class="name"> <%= cat.name %> </span> is a 
     <span class="breed"> <%= cat.breed %> </span> 
    </div> 
<% } %> 

Este código se producirá un error que le dice algo de la locura sobre 'cat' estar fuera de alcance. Eventualmente, cuando mires el código completo generado, verás que el <div> se ha generado como su propio método completo, que es, por supuesto, un alcance diferente sin gatos a la vista.

Volver para una segunda a la plantilla predeterminada para una aplicación MVC:

Verá la plantilla actual que esto da para la head:

<head runat="server"> 
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
    <title><%= Html.Encode(ViewData["Title"]) %></title> 
    <link href="../../Content/Site.css" rel="stylesheet" type="text/css" /> 
</head> 

Esto me pregunto - si está usando <% = sintaxis para escribir el título directamente en la etiqueta title - entonces ¿por qué tendríamos que hacerlo runat?

Resulta como sospechaba que el código subyacente para head busca un valor existente dentro de la etiqueta del título (que habría sido la salida aquí por <%= Html.Encode(ViewData["Title"]) %>. Si encuentra uno (que será el caso para los todos los puntos de vista de muestra en la plantilla MVC) entonces no va a hacer nada más Si no existe ningún título (si ViewData [ "título"] es nulo o vacío) se pondrá por defecto a lo que se define en la vista por el atributo Title:.

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/RRMaster.Master" 
Title="View Products" AutoEventWireup="true" CodeBehind="ViewProduct.aspx.cs" 
Inherits="RR_MVC.Views.Products.ViewProduct" %> 

En mi página maestra, habría eliminado la etiqueta runat='server', ya que no creo que alguna vez quiera completar el título de mi página desde la vista Title propiedad. Pero me estoy retrasando haciendo esto pendiente de la publicación de blog prometida de Phil sobre el tema, en caso de que el servidor runat me brinde algo útil también para mi CSS y JS.

2

No significa que no pueda usar runat = "servidor", sino que no es necesario usar controles del lado del servidor, generalmente, en MVC. Si encuentra que necesita un control del lado del servidor y está trabajando con él en código subyacente, eso es una indicación de que la aplicación está volviendo a los formularios web. Todas las cosas que normalmente suceden en tu shoulo de código subyacente ahora se manejan en tu controlador o en la lógica de la vista.

+0

Hmm, ¿por qué cuando creo una página maestra MVC View por defecto tiene tres servidores runat? Parecería que si estos no son constructos típicos de MVC, al menos los valores predeterminados del código no los tendrían. –

+1

Sigue utilizando el motor de representación ASP y ContentPlaceHolders es la forma de construir páginas maestras en ASP.NET. Tenga en cuenta que la clave es "si se encuentra trabajando con código subyacente": los marcadores de posición en MVC no se direccionan en el código subyacente. – tvanfosson

1

acabamos de leer en este tutorial:

http://www.asp.net/learn/mvc/tutorial-12-cs.aspx

que necesita el

<head runat="server"> 

para poder definir fácilmente el título de página en sus puntos de vista.

+0

No, no es así. Puede usar ViewData o usar MasterPages con un marcador de contenido. –

+0

Correcto, quise decir "automáticamente". Correcto, puedes encargarte y hacerlo tú mismo, por supuesto. –

+2

No, la cabecera runat = "server" (también conocida como HeaderControl) hace que sea fácil hacer referencia a los archivos .css y .js en la sección head. Reescribirá el valor de Href. Creo que escribiré una publicación de blog sobre esto. – Haacked

1

MVC es solo una capa en la parte superior de las formas web. Mis controles de formularios web personalizados también requieren que la etiqueta de cabecera esté accesible en el lado del servidor para el registro de scripts. Estos controles personalizados se representan en el lado del cliente y no usan viewstate ni eventos en el servidor. Debido a esto, también se pueden usar en MVC con el motor de visualización ASPX.

Cuestiones relacionadas