加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 扩展HTML Helper

发布时间:2020-12-16 01:59:23 所属栏目:百科 来源:网络整理
导读:我想要生成的代码类似于: div class="form-group" label for="email"Email address/label input type="email" class="form-control" id="email" placeholder="Enter email"/div 使用这样的东西: @Html.LabelledTextBoxFor(model = model.EmailAddress) 标
我想要生成的代码类似于:

<div class="form-group">
    <label for="email">Email address</label>
    <input type="email" class="form-control" id="email" placeholder="Enter email">
</div>

使用这样的东西:

@Html.LabelledTextBoxFor(model => model.EmailAddress)

标签文本从model.EmailAddress派生的位置

这将使用数据注释完成,例如

[Displayname("Email Address]

完成此任务的最佳方法是什么?

这会影响使用jquery val的自动生成的客户端JS验证吗?

解决方法

我写了一个扩展方法,也许这可能会有所帮助:

public static MvcHtmlString LabelledTextBoxFor<TModel,TResult>(this HtmlHelper<TModel> html,Expression<Func<TModel,TResult>> expression)
{
    ExpressionType type = expression.Body.NodeType;
    if (type == ExpressionType.MemberAccess)
    {
       MemberExpression memberExpression = (MemberExpression) expression.Body;
       var propName = memberExpression.Member.Name;

       var member = memberExpression.Member as PropertyInfo;

       var attributes = member.GetCustomAttributes();

       StringBuilder sb = new StringBuilder();
       foreach (var attribute in attributes)
       {
           if (attribute is DisplayAttribute)
           {
               DisplayAttribute d = attribute as DisplayAttribute;
               var displayName = d.Name;
               sb.Append("<div class="form-group">");
               sb.AppendFormat("<label for="{0}">{1}</label>",propName,displayName);
               sb.AppendFormat(
                        "<input type="email" class="form-control" id="{0}" placeholder="Enter email">",propName);
               sb.Append("</div>");
               return MvcHtmlString.Create(sb.ToString());
             }
         }

     }
       return MvcHtmlString.Create("");
 }

您可以使用默认显示属性来指定显示名称.不需要自定义属性.您可以像这样使用此扩展名:

@Html.LabelledTextBoxFor(model => model.EmailAddress)

注意:我已经尝试过自己并且工作正常.

更新:更简单的版本

public static MvcHtmlString LabelledTextBoxFor2<TModel,TResult>> expression)
    {
        ExpressionType type = expression.Body.NodeType;
        if (type == ExpressionType.MemberAccess)
        {
            var metadata = ModelMetadata.FromLambdaExpression(expression,html.ViewData);
            var displayName = metadata.DisplayName;
            var propName = metadata.PropertyName;

            StringBuilder sb = new StringBuilder();

            sb.Append("<div class="form-group">");
            sb.AppendFormat("<label for="{0}">{1}</label>",displayName);
            sb.AppendFormat(
                        "<input type="email" class="form-control" id="{0}" placeholder="Enter email">",propName);
             sb.Append("</div>");
             return MvcHtmlString.Create(sb.ToString());
        }

        return MvcHtmlString.Create("");
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读