2010-06-17 25 views
21

Soy un principiante en asp.net mvc, y tengo una duda:cliente Id de la Propiedad (ASP.Net MVC)

que estoy tratando de hacer una etiqueta para un cuadro de texto en mi opinión, y yo 'd gustaría saber, ¿cómo puedo tener un ID que se hacen en el cliente para generete guiones ... por ejemplo:

<label for="<%=x.Name.ClientId%>"> Name: </label> 
<%=Html.TextBoxFor(x=>x.Name) %> 

lo que necesitan los puse en 'ClientId' para asegurarse de que la correcta identificación será renderizar al control correspondiente?

, gracias

Saludos

Respuesta

38

Pon este código en alguna parte:

using System; 
using System.Linq.Expressions; 
using System.Web.Mvc; 

namespace MvcLibrary.Extensions 
{ 
    public static class HtmlExtensions 
    { 
     public static MvcHtmlString FieldIdFor<TModel, TValue>(this HtmlHelper<TModel> html, 
      Expression<Func<TModel, TValue>> expression) 
     { 
      string htmlFieldName = ExpressionHelper.GetExpressionText(expression); 
      string inputFieldId = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName); 
      return MvcHtmlString.Create(inputFieldId); 
     } 
    } 
} 

A continuación, en su opinión ASPX:

<label for="<%= Html.FieldIdFor(m => m.EmailAddress) %>">E-mail address:</label> 
<%= Html.TextBoxFor(m => m.EmailAddress) %> 

También puede utilizar esto en JavaScript llamadas como no sabrá la ID del control por adelantado y puede necesitarlo para que algún código JavaScript trabaje en su contra:

<script> $.CoolJQueryFunction('<%= Html.FieldIdFor(m => m.EmailAddress) %>'); </script> 

El método de ayuda HTML LabelFor, que alguien mencionado aquí, no le permitirá especificar la etiqueta de texto real que desea utilizar, tiene que decorar sus ViewModels con atributos para establecer el texto de la etiqueta, con mi humilde opinión. Prefiero que esas cosas aparezcan en la parte de la vista de ASPX propiamente dicha, no en algún modelo de dominio/vista. Sin embargo, algunas personas estarán en desacuerdo conmigo.

No está seguro de las reglas para publicar enlaces a uno de las entradas del blog, pero he publicado un blog sobre este tema exacto: http://www.dominicpettifer.co.uk/Blog/37/strongly-typed--label--elements-in-asp-net-mvc-2

+0

Lo sé, pero algunas personas no pueden entender correctamente (¡mi inglés no está muy bien)! Eso es todo lo que necesito ... ¡Muchas gracias, hombre! Decorar clases de modelo de dominio con atributos no es una buena práctica para mí, ¡estoy de acuerdo contigo! –

+6

Esto debería ser parte del marco. – pbz

+0

No * bastante * funciona dentro de los controles del usuario (es decir, .ascx) –

-2

Usar la siguiente:

Model.Name 

puede simplemente hacer un "ver fuente" o examinar el cuadro de texto renderizado con algo así como Firebug para ver lo que los métodos Html.xyzFor() son generando Normalmente generarían un cuadro de texto con los atributos "id" y "name" establecidos en el nombre de la propiedad.

+0

que va a escribir el contenido de la propiedad, y yo no lo necesita .. Necesito el nombre de la propiedad (o cliente Id ... si hay uno ... no sé excatly) –

+0

@FelipeOriani @womp al usar 'Html.LabelFor (x => x.Id)' me está mostrando el texto "Id" que definí 'DisplayName' de Id en lugar de El valor Id que viene de DB. ¿Algún comentario? – Steve

0

Como se ha dicho, no necesita preocuparse por ClientID, UniqueID, etc. en ASP.NET MVC, ya que son abstracciones de formas web. Simplemente puede escribir la identificación que desea. También hay un método de extensión para esto:

<%= Html.LabelFor(x => x.Name) %> 
+1

LabelFor le dará un

27

MVC 4 ha esta construida en ahora .. ver this

+1

¡Es agradable amigo! Gracias ;) –

5

Es divertido lo se puede encontrar en el código fuente gratuito de MVC. Aquí está la respuesta:

@ Html.IdFor o @ Html.NameFor

Entonces, ¿cuál es la diferencia? Aquí está el truco:

El NameFor no reemplazará ningún "." a "_".

Si desea cualquiera ejemplo, I have found this cool small article

Cuestiones relacionadas