2012-06-27 10 views

risposta

7
public static System.Web.Mvc.MvcHtmlString DtxTextBoxFor<TModel, TValue> 
     (this System.Web.Mvc.HtmlHelper<TModel> html, 
     System.Linq.Expressions.Expression<System.Func<TModel, TValue>> expression, 
     System.Collections.Generic.IDictionary<string, object> htmlAttributes = null, bool readOnly = false) 
    { 
     if (htmlAttributes == null) 
     { 
      htmlAttributes = 
       new System.Collections.Generic.Dictionary<string, object>(); 
     } 

     System.Web.Mvc.ModelMetadata oModelMetadata = 
      System.Web.Mvc.ModelMetadata.FromLambdaExpression(expression, html.ViewData); 

     if (oModelMetadata == null) 
     { 
      if (readOnly) 
      { 
       if (htmlAttributes.ContainsKey("readonly") == false) 
       { 
        htmlAttributes.Add("readonly", "read-only"); 
       } 
      } 
     } 
     else 
     { 
      if (htmlAttributes.ContainsKey("placeholder") == false) 
      { 
       string strHtmlFieldName = 
        System.Web.Mvc.ExpressionHelper.GetExpressionText(expression); 

       string strLabelText = 
        oModelMetadata.DisplayName ?? 
        oModelMetadata.PropertyName ?? 
        strHtmlFieldName.Split('.').Last(); 

       if (string.IsNullOrEmpty(strLabelText) == false) 
       { 
        htmlAttributes.Add("placeholder", strLabelText); 
       } 
      } 

      if ((readOnly) || (oModelMetadata.IsReadOnly)) 
      { 
       if (htmlAttributes.ContainsKey("readonly") == false) 
       { 
        htmlAttributes.Add("readonly", "read-only"); 
       } 
      } 
     } 

     htmlAttributes.Add("class", "form-control"); 

     System.Linq.Expressions.MemberExpression oMemberExpression = 
      expression.Body as System.Linq.Expressions.MemberExpression; 

     if (oMemberExpression != null) 
     { 
      System.ComponentModel.DataAnnotations.StringLengthAttribute oStringLengthAttribute = 
       oMemberExpression.Member.GetCustomAttributes 
       (typeof(System.ComponentModel.DataAnnotations.StringLengthAttribute), false) 
       .FirstOrDefault() as System.ComponentModel.DataAnnotations.StringLengthAttribute; 

      if (oStringLengthAttribute != null) 
      { 
       if (htmlAttributes.ContainsKey("maxlength") == false) 
       { 
        htmlAttributes.Add("maxlength", oStringLengthAttribute.MaximumLength); 
       } 
      } 
     } 

     return (html.TextBoxFor(expression, htmlAttributes)); 
    } 
20

Hai solo bisogno di creare un extension method su HtmlHelper:

public static class MyHtmlHelpers 
{ 
    public static MvcHtmlString MyTextBoxFor<TModel, TProperty>(
     this HtmlHelper<TModel> helper, 
     Expression<Func<TModel, TProperty>> expression) 
    { 
     return helper.TextBoxFor(expression, new { @class = "txt" }); 
    } 
} 

Poi a suo avviso è possibile utilizzarlo come:

@Html.MyTextBoxFor(model => model.FirstName) 

Nota: Non dimenticare di @using il namespace di MyHtmlHelpers se le vostre opinioni.

+0

beh ... thnx per la soluzione, volevo solo sapere che posso fare lo stesso nome dell'estensione, significa invece di MyTextBoxFor , Posso mantenere il nome come TextForFor? – user584018

+0

È possibile avere un metodo di estensione con lo stesso nome, ad es. 'TextBoxFor', il problema è che lo spazio dei nomi del' TextBoxFor' incorporato è incluso di default. Quindi per usare il tuo metodo di estensione devi chiamare la classe statica 'MyHtmlHelpers.TextBoxFor (Html, model => model.FirstName) 'altrimenti il ​​compilatore non può disambiguare. È possibile rimuovere l'inclusione dello spazio dei nomi predefinito, ma chiamare gli helper integrati sarà problematico. – nemesv

+1

come accettare htmlAttrbutes nell'input del nostro HtmlHelper e aggiungere questa classe a loro? @nemesv – MRebati

1

Sulla base di @nemesv la risposta è un'estensione che supporta htmlAttributes con attributi personalizzati aggiuntivi.

vb.net:

<Extension()> 
Function MyTextBoxFor(Of TModel, TProperty)(ByVal helper As HtmlHelper(Of TModel), ByVal expression As Expression(Of Func(Of TModel, TProperty)), htmlAttributes As Object) As MvcHtmlString   
    'copy htmlAttributes object to Dictionary 
    Dim dicHtmlAttributes As New Dictionary(Of String, Object) 
    For Each prop in htmlAttributes.GetType().GetProperties() 
     dicHtmlAttributes.Add(prop.Name,prop.GetValue(htmlAttributes)) 
    Next 
    'add custom attribute 
    dicHtmlAttributes.Add("foo","bar") 

    Return helper.TextBoxFor(expression, dicHtmlAttributes) 
End Function 

C#:

public static MvcHtmlString MyTextBoxFor<TModel, TProperty>(
    this HtmlHelper<TModel> helper, 
    Expression<Func<TModel, TProperty>> expression, object htmlAttributes) 
{ 
    //copy htmlAttributes object to Dictionary 
    Dictionary<string, object> dicHtmlAttributes = new Dictionary<string, object>; 
    foreach (var prop in htmlAttributes.GetType().GetProperties()) 
    { 
     dicHtmlAttributes.Add(prop.Name, prop.GetValue(htmlAttributes)); 
    } 
    //add custom attribute 
    dicHtmlAttributes.Add("foo", "bar"); 
    return helper.TextBoxFor(expression, dicHtmlAttributes); 
} 
Problemi correlati