2010-01-12 22 views
8

Tengo un proyecto ASPNET MVC 2. Cuando usoTextBoxFor representación en HTML con prefijo en el atributo ID

<%= Html.TextBoxFor(model => model.Login) %> 

la TexBoxFor rendirá como

<input id="Login" name="Login" type="text" value="" /> 

campo en el modelo es

[Required(ErrorMessage = "")] 
[DisplayName("Login")] 
public string Login { get; set; } 

¿Puedo hecho Identificación y nombre atributo con algunos prefijo? Como

<input id="prefixLogin" name="prefixLogin" type="text" value="" /> 

Gracias a todos.

Respuesta

13

Parece que MVC 2 RTM no proporciona actualmente esta función. Puede probar estos métodos de extensión:

   public static MvcHtmlString ValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression) 
    { 
     return ValidationMessageFor(htmlHelper, prefix, expression, null, new RouteValueDictionary()); 
    } 

    public static MvcHtmlString ValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression, string validationMessage) 
    { 
     return ValidationMessageFor(htmlHelper, prefix, expression, validationMessage, new RouteValueDictionary()); 
    } 

    public static MvcHtmlString ValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression, string validationMessage, object htmlAttributes) 
    { 
     return ValidationMessageFor(htmlHelper, prefix, expression, validationMessage, new RouteValueDictionary(htmlAttributes)); 
    } 

    public static MvcHtmlString ValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression, string validationMessage, IDictionary<string, object> htmlAttributes) 
    { 
     return htmlHelper.ValidationMessage(String.Format("{0}.{1}", prefix, ExpressionHelper.GetExpressionText(expression)), 
      validationMessage, 
      htmlAttributes); 
    } 

    public static MvcHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression) 
    { 
     return HiddenFor(htmlHelper, prefix, expression, (IDictionary<string, object>)null); 
    } 

    public static MvcHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression, object htmlAttributes) 
    { 
     return HiddenFor(htmlHelper, prefix, expression, new RouteValueDictionary(htmlAttributes)); 
    } 

    public static MvcHtmlString HiddenFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes) 
    { 
     return htmlHelper.Hidden(String.Format("{0}.{1}", prefix, ExpressionHelper.GetExpressionText(expression)), 
      ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model, 
      htmlAttributes); 
     /*return HiddenHelper(htmlHelper, 
          ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model, 
          false, 
          ExpressionHelper.GetExpressionText(expression), 
          htmlAttributes);*/ 
    } 

    public static MvcHtmlString TextAreaFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression) 
    { 
     return TextAreaFor(htmlHelper, prefix, expression, (IDictionary<string, object>)null); 
    } 

    public static MvcHtmlString TextAreaFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression, object htmlAttributes) 
    { 
     return TextAreaFor(htmlHelper, prefix, expression, new RouteValueDictionary(htmlAttributes)); 
    } 

    public static MvcHtmlString TextAreaFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes) 
    { 
     if (expression == null) 
     { 
      throw new ArgumentNullException("expression"); 
     } 

     string value; 
     var modelMetadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
     if (modelMetadata.Model != null) 
      value = modelMetadata.Model.ToString(); 
     else 
      value = String.Empty; 

     return htmlHelper.TextArea(String.Format("{0}.{1}", prefix, ExpressionHelper.GetExpressionText(expression)), 
      value, 
      htmlAttributes); 
    } 

    public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression) 
    { 
     return TextBoxFor(htmlHelper, prefix, expression, (IDictionary<string, object>)null); 
    } 

    public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression, object htmlAttributes) 
    { 
     return TextBoxFor(htmlHelper, prefix, expression, new RouteValueDictionary(htmlAttributes)); 
    } 

    public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string prefix, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes) 
    { 
     return htmlHelper.TextBox(String.Format("{0}.{1}", prefix, ExpressionHelper.GetExpressionText(expression)), 
      ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model, 
      htmlAttributes); 
    } 
+1

se son una leyenda – ajbeaven

+0

Lo necesitaba porque necesitaba el prefijo configurado en algunos objetos pero no en otros. – Chris

6

Siempre se puede establecer htmlAttributes, aunque no es la manera más limpia de hacerlo.
Y, tendrías que hacerlo en todos tus ayudantes.

<%: Html.TextBoxFor(model => model.Login, new { @id = "prefixLogin" }) %> 
+0

¿Alguien ha verificado realmente si esto funciona? Porque no creo que lo haga No creo que pueda establecer el nombre o la propiedad de identificación utilizando el objeto anónimo utilizando el HtmlHelper incorporado porque fusiona sus valores sobre su objeto htmlAttributes. Creé algunos ayudantes personalizados para mi propio uso, donde reordené el uso para que, si quisiera, pudiera hacer lo que dijo aquí. –

+0

La propiedad 'id' se puede cambiar, pero 'name' no. 'Nombre' se sobrescribe. El problema sería que LabelFor, ValidationMessageFor y TextBoxFor (un ejemplo) se desincronizarían si el campo de identificación cambia de manera incoherente, por lo que los métodos de extensión son el camino a seguir. –

0

Hay otra solución diferente para mismo problema .. He creado un nuevo proyecto de prueba MVC y copiado web.config totalidad del objeto de la vieja proyecto en el que estaba recibiendo este error, resuelto

Cuestiones relacionadas