博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TextBoxFor控件的扩展---Bootstrap在mvc上的应用
阅读量:5371 次
发布时间:2019-06-15

本文共 5923 字,大约阅读时间需要 19 分钟。

TextBoxFor控件的问题:

1:自带了样式,再用bootstrap样式会有冲突。

2:要加水印,js事件,限制输入长度比较麻烦。

因此需要对textboxfor控件进行扩展。

目标:

1:能使用bootstrap样式。

2:能复用mvc的验证。

3:可以方便的添加水印。

4:能限制输入字符的长度。

5:采用一些命名约定,使用扩展控件。(说白了,就是日期类型的直接给上边加上调用日期控件的调用。)

解决方案

最容易想到的解决办法就是直接写个扩展方法,进行字符串拼接生成控件。使用的时候:@BootStrap.TextBoxFor(u=>u.Email)

最终生成:

                

实现时候,悲催了。发现很难直接获取属性的验证信息,难道要自己再写反射,读取特性。生成对应的验证信息。

另一条路,借助mvc的htmlhelper来完成了。

public static MvcHtmlString BsTextBoxFor
(this HtmlHelper
htmlHelper, Expression
> expression,string css="", string placeholder="") { TagBuilder tagBuilder = new TagBuilder("input"); ModelMetadata metadata = ModelMetadata.FromLambdaExpression
(expression, htmlHelper.ViewData); //tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(ExpressionHelper.GetExpressionText(expression), metadata)); string name = ExpressionHelper.GetExpressionText(expression); //var vas = htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata); htmlHelper.ValidateFor(expression); tagBuilder.MergeAttribute("name",name); tagBuilder.GenerateId(name); tagBuilder.MergeAttribute("type","text");        //核心代码,直接通过这个方法可以获取属性上的验证信息,如:“data-val= ....”。有一点要注意,在一个属性上,调用了这个方法完成后。mvc底层代码会自动释放这个验证对象。也就是说,一个属性的输入文本框只会第一个上边会生成相关的验证。
var vas = htmlHelper.GetUnobtrusiveValidationAttributes(name,metadata); if (!string.IsNullOrEmpty(placeholder)) { tagBuilder.MergeAttribute("placeholder",placeholder); }        //string类型,看有没长度限制,如果有,增加maxlength,minlength            if (metadata.ModelType == typeof (string))            {                var len = metadata.ContainerType.GetProperty(name).GetCustomAttribute(typeof(StringLengthAttribute));                if (len != null)                {                    var stringlength = (StringLengthAttribute) len;                    if (stringlength.MaximumLength > 0)                    {                        tagBuilder.MergeAttribute("maxlength", stringlength.MaximumLength.ToString());                    }                    if (stringlength.MinimumLength > 0)                    {                        tagBuilder.MergeAttribute("minlength", stringlength.MinimumLength.ToString());                    }                }            }        //如果model值不为,null,进行赋值。            if (metadata.Model != null)            {
          todo:还要完善。 tagBuilder.MergeAttribute("value",metadata.Model.ToString()); } tagBuilder.MergeAttributes(vas); tagBuilder.AddCssClass("form-control"); if (!string.IsNullOrEmpty(css)) { tagBuilder.AddCssClass(css); }        //约定,属性名以day或者date结束的属性为日体,为其增加日期选择功能。 if (name.ToLower().EndsWith("day") || name.ToLower().EndsWith("date")) { tagBuilder.MergeAttribute("onclick", "WdatePicker()"); } return new MvcHtmlString(tagBuilder.ToString()); }

 

最终实现效果:

View部分代码:

@Html.BsLabelFor(model => model.Email)
@*@Html.TextBoxFor(model => model.Email, new { @class = "form-control" })*@ @Html.BsTextBoxFor(model=>model.Email) @Html.ValidationMessageFor(model => model.Email, "", new { @class = "help-block" })
@Html.BsLabelFor(model => model.Salary)
$
@Html.BsTextBoxFor(model => model.Salary)
.00
@Html.ValidationMessageFor(model => model.Salary, "", new { @class = "help-block" })
@Html.BsLabelFor(model => model.Code)
@Html.BsTextBoxFor(model => model.Code)
@Html.ValidationMessageFor(model => model.Code, "", new { @class = "help-block" })
@Html.BsLabelFor(model => model.BirthDay)
@Html.BsTextBoxFor(model => model.BirthDay)
@Html.ValidationMessageFor(model => model.BirthDay)

viewModel代码:

public class VerifyModel    {        public Guid Id { get; set; }        [DisplayName("用户名")]        [Required]        [StringLength(15)]        [Remote("CheckName", "Form")]        public string UserName { get; set; }        [DisplayName("密码")]        [Required]        [StringLength(20,MinimumLength = 4)]        [DataType(DataType.Password)]        public string PassWord { get; set; }        [DataType(DataType.Password)]        [System.ComponentModel.DataAnnotations.Compare("PassWord", ErrorMessage = "两次输入密码不一致")]        [DisplayName("确认密码")]        public virtual string ConfirmPassWord { get; set; }        [StringLength(50)]        [DisplayName("邮箱")]        [Required]        [DataType(DataType.EmailAddress)]        [RegularExpression(@".+")]        public string Email { get; set; }        [RegularExpression(@"1\d{10}", ErrorMessage = "请输入正确的手机号码")]        [DisplayName("手机")]        [Required]        public string Phone { get; set; }        [DisplayName("薪水")]        [Required]        public decimal Salary { get; set; }         [RegularExpression(@"d{6}", ErrorMessage = "邮编为六位数字")]        [DisplayName("邮编")]        [Required]        public string Code { get; set; }        [DisplayName("生日")]        [Required]        public DateTime BirthDay { get; set; }    }

最后:

配合T4模板,采用一些命名约定能更快捷的生成各种表单页面。

转载于:https://www.cnblogs.com/henq/p/4453287.html

你可能感兴趣的文章
Swift迎来了1.0 GM 版(2014.09.09)
查看>>
【iOS开发-68】APP下载案例:利用tableView自带的cell布局+缓存池cell复用时注意button状态的检查...
查看>>
《Genesis-3D开源游戏引擎-FQA常见问题解答》2014年01月10号版本
查看>>
Java 编程下实现随机无重复数字功能
查看>>
Android 编程下的代码混淆
查看>>
animation属性
查看>>
页内的模块和组件抽象规划经验
查看>>
安全-分析深圳电信的新型HTTP劫持方式
查看>>
将Centos的yum源更换为国内的阿里云源
查看>>
git diff 的用法
查看>>
一段sql的优化
查看>>
十进制与十六进制的相互转换
查看>>
在Flex中用Validator检测数字、字符串、Email.
查看>>
[leetcode]4Sum
查看>>
POJ1062 昂贵的聘礼
查看>>
【零基础学习iOS开发】【02-C语言】08-基本运算
查看>>
Java 将指定字符串连接到此字符串的结尾 concat()
查看>>
Hibernate Criterion
查看>>
Python知识
查看>>
我们为什么要搞长沙.NET技术社区(三)
查看>>