2016-10-25 6 views
0

Я хочу, чтобы отключить или включить текстовое поле на основе логического значения, я создал этот метод расширения:Как изменить или добавить атрибуты в html-поля с помощью 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); 
     } 

И как я использовал:

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

, но он не работает, я новый к классу Htmlhelper, хотя это не сложно понять, но я, конечно, что-то пропустил!

Edit:

Я попробовал этот простой метод, чтобы выяснить проблему:

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); 
     } 

И что было оказано: <input id="txtbx" name="txtbx" type="text" value="System.Collections.Generic.Dictionary``2[System.String,System.String]">

+1

Возможно, это просто опечатка в примере: почему вы называете исходную версию 'TextBoxFor' с помощью' htmlAttributes' как параметра вместо «атрибутов»? – Markus

+0

Я передам логическое выражение, а не просто 'true' или' false' –

+0

попробуйте использовать 'IDictionary attrs = HtmlHelper.AnonymousObjectToHtmlAttributes (htmlAttributes);' –

ответ

2

Код для вас потребностей метод расширения должно быть

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); 
} 

В первом примере кода, ваше использование

return htmlHelper.TextBoxFor(expression, htmlAttributes); 

возвращает первоначальные атрибуты, а не обновленные атрибуты, которые включает в себя атрибут disabled. Это должно было

return htmlHelper.TextBoxFor(expression, attributes); 

В вашем втором примере кода вы используете метод TextBox(), а что TextBoxFor() и второй параметр является значение, а не атрибуты, и это должно было быть

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

Несмотря на то, что не связано с вашей собственностью из-за неправильного атрибута name.

Сторона примечания: ее немного непонятно, почему вы когда-нибудь захотите это сделать. Элементы управления, отключенные, не передают значение, поэтому вы можете просто визуализировать значение свойства как текст в представлении. Если вы хотите, чтобы его значение было отправлено, то оно должно быть readonly, а не disabled

+0

Отлично, спасибо! Я пытался передать атрибут 'value', но не отображался, знаете ли вы, почему атрибут типа' style' работает нормально. Я пробовал это: '@ Html.MyTextBoxFor (model => model.Body, new {@class =" form-control ", style =" background-color: yellow; ", value =" hurray "}, true)' –

+1

Зачем вам это нужно. Вы никогда не устанавливаете атрибут 'value' (или атрибут' name') при использовании методов «HtmlHelper» (методы устанавливают этот атрибут на основе значения свойства). Поэтому, если 'model.Body =" hurray "', то он будет сгенерирован правильно (установка атрибута 'value' заставляет привязку модели привязать) –

+0

aha, я вижу, спасибо за это. –