Create CheckboxFor MVC helper with title attribute from model description

后端 未结 2 1549
陌清茗
陌清茗 2021-01-20 07:26

I\'ve created a text box helper to add a title (tooltip) taken from the description attribute for the field in a model:

 public static MvcHtmlString TextBoxF         


        
相关标签:
2条回答
  • 2021-01-20 07:48

    You current implementations are not taking into account model binding and ModelState, do not generate the attributes necessary for unobtrusive validation and can generate incorrect id attributes.

    Make use of the existing html helper methods in your own helpers so you generate the correct html. Your TextBoxForWithTitle() method need only be

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

    and similarly the CheckBoxForWithTitle() would be the same except

    return htmlHelper.CheckBoxFor(expression, attributes);
    

    Side note: To see how the existing helpers actually work, you can view the source code here

    0 讨论(0)
  • 2021-01-20 07:50

    I tried and it seems to work so far - still have to try a few examples where I need the ID of the element:

     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 讨论(0)
提交回复
热议问题