2015-05-08 48 views
1

我創建了一個文本框助手添加標題(提示)從描述屬性在模型中採取現場title屬性:創建CheckboxFor MVC助手與模型描述

public static MvcHtmlString TextBoxForWithTitle<Tmodel, TProperty>(this HtmlHelper<Tmodel> htmlHelper, Expression<Func<Tmodel, TProperty>> expression, object htmlAttributes = null) 
    { 
     var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
     string htmlFieldName = ExpressionHelper.GetExpressionText(expression); 
     string textboxText = metaData.DisplayName ?? metaData.PropertyName ?? htmlFieldName.Split('.').Last(); 
     if (string.IsNullOrEmpty(textboxText)) 
      return MvcHtmlString.Empty; 
     var textbox = new TagBuilder("input"); 
     textbox.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 
     if (!string.IsNullOrEmpty(metaData.Description)) 
      textbox.Attributes.Add("title", metaData.Description); 
     return MvcHtmlString.Create(textbox.ToString()); 
    } 

我知道複選框也是一個'輸入'類型的元素,但我不知道如何構建一個幫助器來使用描述作爲標題。

public static MvcHtmlString CheckBoxForWithTitle<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null) 
    { 
     var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
     string htmlFieldName = ExpressionHelper.GetExpressionText(expression); 
     string chkboxText = metaData.DisplayName ?? metaData.PropertyName ?? htmlFieldName.Split('.').Last(); 
     MemberExpression memberExpression = expression.Body as MemberExpression; 
     string parameterName = memberExpression.Member.Name; 

     if (string.IsNullOrEmpty(chkboxText)) 
      return MvcHtmlString.Empty; 
     var chkbox = new MvcHtmlString(
      string.Format(
      "<input type=\"checkbox\" name=\"{0}\" id=\"{0}\" value=\"{1}\" {2} />", 
      parameterName, 
     chkbox.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 
     if (!string.IsNullOrEmpty(metaData.Description)) 
      chkbox.Attributes.Add("title", metaData.Description); 
     return MvcHtmlString.Create(chkbox.ToString()); 
    } 

回答

3

您目前的實現都沒有考慮到模型綁定和ModelState,請不要生成不顯眼驗證所需的屬性,並且可能會生成不正確的id屬性。

在您自己的助手中使用現有的html幫手方法,以便生成正確的html。你TextBoxForWithTitle()方法只需要

public static MvcHtmlString TextBoxForWithTitle<Tmodel, TProperty>(this HtmlHelper<Tmodel> htmlHelper, Expression<Func<Tmodel, TProperty>> expression, object htmlAttributes = null) 
{ 
    var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
    IDictionary<string, object> attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); 
    if (!string.IsNullOrEmpty(metaData.Description)) 
    { 
     attributes.Add("title", metaData.Description); 
    } 
    return htmlHelper.TextBoxFor(expression, attributes); 
} 

,同樣的CheckBoxForWithTitle()將是相同的,除了

return htmlHelper.CheckBoxFor(expression, attributes); 

附註:要查看現有的助手是如何工作的,你可以查看源代碼here

+0

謝謝Stephen!我知道我必須以某種方式回到實際的幫手項目! –

0

我嘗試,它似乎工作至今 - 還是要儘量在我需要的元素的ID的幾個例子:

public static MvcHtmlString CheckBoxForWithTitle<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null) 
    { 
     var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
     string htmlFieldName = ExpressionHelper.GetExpressionText(expression); 
     string chkboxText = metaData.DisplayName ?? metaData.PropertyName ?? htmlFieldName.Split('.').Last(); 
     MemberExpression memberExpression = expression.Body as MemberExpression; 
     string parameterName = memberExpression.Member.Name; 

     if (string.IsNullOrEmpty(chkboxText)) 
      return MvcHtmlString.Empty; 
     var chkbox = new TagBuilder("input"); 
     chkbox.Attributes.Add("type", "checkbox"); 
     chkbox.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 
     if (!string.IsNullOrEmpty(metaData.Description)) 
      chkbox.Attributes.Add("title", metaData.Description); 
     return MvcHtmlString.Create(chkbox.ToString()); 
    } 
+0

不幸的是,這並不完全正常。當使用常規的checkboxfor並且我用模型中的值加載時,它會被檢查是否爲真,但是這個新的不會。任何人有任何想法爲什麼不呢? –