2016-10-25 2 views
0

Je veux désactiver ou activer une zone de texte basée sur la valeur booléenne, j'ai créé cette méthode d'extension:Comment changer ou ajouter des attributs aux champs html via des méthodes d'aide html?

public static IHtmlString MyTextBoxFor<TModel,TProperty>(
      this HtmlHelper<TModel> htmlHelper, 
      Expression<Func<TModel,TProperty>> expression, 
      object htmlAttributes, 
      bool disabled 
      ) 
     { 
      var attributes = new RouteValueDictionary(htmlAttributes); 
      if (disabled) 
      { 
       attributes.Add("disabled", "\"disabled\""); 
      } 
      return htmlHelper.TextBoxFor(expression, htmlAttributes); 
     } 

Et comment je:

 <div class="col-md-10"> 
      @Html.MyTextBoxFor(model => model.Body, new { @class = "form-control"}, true) 
     </div> 

mais ca marche pas, je suis nouveau à la classe Htmlhelper, même si ce n'est pas difficile à comprendre, mais j'ai certainement raté quelque chose!

Edit:

J'ai essayé cette méthode simple, pour trouver le problème:

public static IHtmlString MyTextBox(this HtmlHelper htmlHelper,object htmlAttributes, bool disabled) 
     { 
      IDictionary<string, object> attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); 
      //var attrs = new Dictionary<string,string>(); 
      if (disabled) 
      { 
       attrs.Add("disabled", "disabled"); 
       attrs.Add("value", "txxxxxxt"); 
      } 
      return htmlHelper.TextBox("txtbx", attrs); 
     } 

et qui a été rendu: <input id="txtbx" name="txtbx" type="text" value="System.Collections.Generic.Dictionary``2[System.String,System.String]">

+1

Peut-être que c'est juste une faute de frappe dans l'exemple: pourquoi appelez-vous la version originale de 'TextBoxFor' avec' htmlAttributes' comme paramètre à la place d'attributs? – Markus

+0

Je vais passer une expression booléenne, pas simplement 'true' ou' false' –

+0

essayez d'utiliser 'IDictionary attrs = HtmlHelper.AnonymousObjectToHtmlAttributes (htmlAttributes);' –

Répondre

2

Le code pour vous besoins de méthode d'extension être

public static IHtmlString MyTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes, bool disabled) 
{ 
    IDictionary<string, object> attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); 
    if (disabled) 
    { 
     attrs.Add("disabled", "disabled"); 
    } 
    return htmlHelper.TextBoxFor(expression, attrs); 
} 

Dans votre premier exemple de code, votre utilisation de

return htmlHelper.TextBoxFor(expression, htmlAttributes); 

renvoyait les attributs d'origine, et non pas les attributs mis à jour qui inclut l'attribut disabled. Il aurait dû être

return htmlHelper.TextBoxFor(expression, attributes); 

Dans votre deuxième exemple de code, votre aide de la méthode TextBox() plutôt que TextBoxFor() et le 2ème paramètre est la valeur, pas les attributs, et il aurait dû être

return htmlHelper.TextBox("txtbx", null, attrs); 

bien cela ne serait pas lié à votre propriété en raison de l'attribut name incorrect.

Note de côté: C'est un peu difficile de savoir pourquoi vous voudriez faire cela. Les contrôles désactivés ne soumettent pas de valeur, vous pouvez donc simplement afficher la valeur de la propriété sous forme de texte dans la vue. Si vous voulez que sa valeur soit soumise, alors elle devrait être readonly, pas disabled

+0

Super, merci! J'ai essayé de passer l'attribut 'value' mais je n'ai pas rendu, savez-vous pourquoi, bien que l'attribut' style' fonctionne bien. J'ai essayé ceci: '@ Html.MyTextBoxFor (model => model.Body, nouveau {@class =" form-control ", style =" couleur de fond: jaune; ", value =" hourra "}, true)' –

+1

Pourquoi voudriez-vous faire cela. Vous ne définissez jamais l'attribut 'value' (ou l'attribut' name') lorsque vous utilisez les méthodes 'HtmlHelper' (les méthodes définissent cet attribut en fonction de la valeur de la propriété). Donc, si 'model.Body =" hourra "' alors il sera généré correctement (la valeur de l'attribut 'value' vissera la liaison du modèle) –

+0

aha, je vois, merci pour cela. –