2017-05-11 1 views
0

Je suis en train d'ajouter l'attribut HTML dans la méthode d'extension pour le sélecteur de datetime de kendoComment ajouter htmlAttributes supplémentaires en extension pour Kendo DatePicker

public static DatePickerBuilder Readonly(this DatePickerBuilder builder, bool isReadOnly) 
    { 
     if (isReadOnly) 
     { 
      var dic = new Dictionary<string, object>(); 
      dic.Add("readonly", "readonly"); 
      builder.HtmlAttributes(dic); 
     } 

     return builder; 
    } 

Le code ci-dessus fonctionne. Mais son dictionnaire de création inutile. La méthode HtmlAttribute prend object comme paramètre, comment puis-je l'utiliser pour ne pas avoir à créer de dictionnaire?

Note: Je ne veux pas utiliser la syntaxe de rasoir pour ajouter l'attribut lecture seule

Mise à jour 1
donc je résolu la question ci-dessus en modifiant le code comme ci-dessous

public static DatePickerBuilder Readonly(this DatePickerBuilder builder, bool isReadOnly) 
    { 
     if (isReadOnly) 
     { 
      var comp = builder.ToComponent(); 
      comp.HtmlAttributes.Add("readonly", "readonly"); 
     } 

     return builder; 
    } 

Cependant, je dois pour m'assurer dans le rasoir j'appelle readonly() méthode d'extension comme dernière méthode dans la chaîne.

Code du coup ne fonctionne pas

@(Html.Kendo().DatePickerFor(x => x.Deadline) 
       .Format("MM/dd/yyyy")        
       .Readonly(Model.IsEnabled) 
       .HtmlAttributes(new { data_inherit_value = Model.InheritDeadline })) 

Je pense que son problème avec un contrôle de sélecteur de date Kendo. Il écrase les attributs html existants

Si je change l'ordre et que j'utilise readonly à la fin, le code fonctionne.

@(Html.Kendo().DatePickerFor(x => x.Deadline) 
       .Format("MM/dd/yyyy")     
       .HtmlAttributes(new { data_inherit_value = Model.InheritDeadline }) 
       .Readonly(Model.IsEnabled)) 

Répondre

0

En fait, ils clairement la collection htmlAttributes avant Fusion, le maintenant effacé, collection htmlAttributes avec tout ce que vous passez les attributs. Je dirais un bug ...

/// <summary>Sets the HTML attributes.</summary> 
/// <param name="attributes">The HTML attributes.</param> 
/// <returns></returns> 
public virtual TBuilder HtmlAttributes(object attributes) 
{ 
    return this.HtmlAttributes(attributes.ToDictionary()); 
} 

/// <summary>Sets the HTML attributes.</summary> 
/// <param name="attributes">The HTML attributes.</param> 
/// <returns></returns> 
public virtual TBuilder HtmlAttributes(IDictionary<string, object> attributes) 
{ 
    this.Component.HtmlAttributes.Clear(); 
    Kendo.Mvc.Extensions.DictionaryExtensions.Merge(this.Component.HtmlAttributes, attributes); 
    return this as TBuilder; 
} 

une façon de contourner cela est de créer une extension MergeHtmlAttributes pour chaque commande que vous utilisez:

public static TextBoxBuilder<T> MergeHtmlAttributes<T>(this TextBoxBuilder<T> builder, object attributes) 
{ 
    Kendo.Mvc.Extensions.DictionaryExtensions.Merge(builder.ToComponent().HtmlAttributes, attributes); 
    return builder; 
} 

... et à votre avis:

@(Html.Kendo().TextBoxFor(m => m.FirstName) 
    .Enable(Model.IsViewEditable) 
    .MergeHtmlAttributes(new {@class = "k-textbox"}))