2010-01-12 3 views
8

J'ai un projet ASPNET MVC 2. Quand j'utiliseRendu TextBoxFor en HTML avec préfixe sur l'attribut ID

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

le TexBoxFor rendra comme

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

terrain dans le modèle est

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

Puis-je fait id et nom attribut avec un certain préfixe? Comme

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

Merci à tous.

Répondre

13

Il semble que MVC 2 RTM ne propose actuellement pas cette fonctionnalité. Vous pouvez essayer ces méthodes d'extension:

   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

résolu vous sont une légende. – ajbeaven

+0

J'en avais besoin car j'avais besoin du préfixe sur certains objets mais pas sur d'autres. – Chris

6

Vous pouvez toujours définir htmlAttributes, bien que ce n'est pas la plus propre façon de le faire.
Et, vous devriez le faire dans tous vos assistants.

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

Est-ce que quelqu'un a réellement vérifié si cela fonctionne? Parce que je ne le pense pas. Je ne pense pas que vous pouvez définir le nom ou la propriété id en utilisant l'objet anonyme en utilisant le HtmlHelper intégré, car il fusionne ses valeurs sur votre objet htmlAttributes. J'ai créé quelques aides personnalisées pour mon propre usage où j'ai réordonné l'utilisation de sorte que si je veux cela je pourrais faire ce que vous avez dit ici. –

+0

La propriété 'id' peut être changée mais 'name' ne peut pas. 'Nom' est écrasé. Le problème serait que LabelFor, ValidationMessageFor et TextBoxFor (un exemple) ne soient pas synchronisés si le champ id est modifié de manière incohérente, donc les méthodes d'extension sont la solution. –

0

Il existe différentes solutions différentes pour même question .. J'ai créé un nouveau projet de test et mvc recopié web.config de vue l'ensemble de l'ancien projet où je recevais cette erreur,