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(""); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |