come creare un helper HTML per estendere TextBoxFor() per aggiungere lo stile CSS?come creare un helper HTML per estendere TextBoxFor() per aggiungere lo stile CSS?
@Html.TextBoxFor(model => model.FirstName, new { @class = "txt" })
come creare un helper HTML per estendere TextBoxFor() per aggiungere lo stile CSS?come creare un helper HTML per estendere TextBoxFor() per aggiungere lo stile CSS?
@Html.TextBoxFor(model => model.FirstName, new { @class = "txt" })
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));
}
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.
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
È 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
come accettare htmlAttrbutes nell'input del nostro HtmlHelper e aggiungere questa classe a loro? @nemesv – MRebati
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);
}
possibile duplicato del [ASP.NET MVC - Estendere TextBoxFor senza ri-scrivere il metodo] (http://stackoverflow.com/ domande/6202053/asp-net-mvc-extending-textboxfor-senza-re-writing-the-method) –