MVC与Validate验证提示的样式修改
MVC中使用Validate的验证,要修改错误提示样式一共有3处需要修改,否则就不太完美了;
MVC中的Validate的验证机制只用在后台写一次,就可以完成前台和后台的完美验证,前台的验证主要是依靠Validate.js来完成,Validate只是作为一个验证插件,但是错误提示是靠微软的jquery.validate.unobtrusive.js这个js来完成,但是他只负责给错误的边框加上红色,且在后面出现一个span来显示,有时候会撑坏布局;
可以使用自定义的验证提示来做到比原始验证漂亮的验证提示;
先是找到一款tip提示的插件,有事件和方法进行tip提示的代码控制显示和隐藏及销毁即可;poshytip:http://vadikom.com/demos/poshytip/# 还算不错,基本可以满足要求;
MVC的强类型提交表单处理好之后:
public class MemberUser
{
[Required(ErrorMessage="用户名不能为空")]
public string UserName { get; set; }
[Required(ErrorMessage = "密码不能为空")]
public string PassWord { get; set; }
}
页面代码:
@using (Ajax.BeginForm(new AjaxOptions { Url = "/Home/SaveMemberUser/" }))
{
@Html.ValidationSummary(true)
<table>
<tr>
<td style="width:80px;text-align:right;">用户</td>
<td style="width:200px">
@Html.TextBoxFor(m => m.UserName)
@Html.ValidationMessageFor(m=>m.UserName)
</td>
</tr>
<tr>
<td style="width: 80px; text-align: right;">密码</td>
<td style="width:200px">
@Html.TextBoxFor(m => m.PassWord)
@Html.ValidationMessageFor(m => m.PassWord)
</td>
</tr>
<tr>
<td colspan="" style="text-align:center">
<input type="submit" value="提交" />
</td>
</tr>
</table>
}
注:ValidationMessageFor是必须得,因为错误提示的跟踪点是在ValidationMessageFor生成的span上进行的;jquery、validate、validate. Unobtrusive这几个js是必须得;
我们只需要将validate.unobtrusive中进行错误消息提示时进行拦截即可;每次错误提示都会触发validate.unobtrusive中的onError事件;我们改写如下就可以:
function onError(error, inputElement) { // 'this' is the form element
var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"),
replaceAttrValue = container.attr("data-valmsg-replace"),
replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;
//add
var $customErrorTip = container.attr("data-forerrortip");
container.removeClass("field-validation-valid").addClass("field-validation-error");
error.data("unobtrusiveContainer", container);
//add
var elem = $("#" + inputElement[0].name.replace(".", "_"));//添加提示消息
if (replace) {
container.empty();
//add start
if (error.html() != "") {
if ($customErrorTip) {
$("#" + $customErrorTip).poshytip("destroy");
} else {
elem.poshytip("destroy");
}
var direction = "right";
//左边+元素宽+提示的文字+提示两边的空白
if ((elem[0].offsetLeft + elem.width() + error.length * 10 + 20) > $(document).width()) {
direction = "left";
}
var errorConfig = {
content: error,
alignTo: 'target',
alignX: direction,
alignY: 'center',
showOn: 'none',
bgImageFrameSize: 7,
offsetX: 5
};
if ($customErrorTip) {
$("#" + $customErrorTip).poshytip(errorConfig).poshytip('show');
} else {
elem.filter(':not(.valid)').poshytip(errorConfig).poshytip('show');
}
} else {
if ($customErrorTip) {
$("#" + $customErrorTip).poshytip("destroy");
} else {
elem.poshytip("destroy");
}
}
//add end
//update disable
//error.removeClass("input-validation-error").appendTo(container);
}
else {
error.hide();
}
}
效果图:

到此就完了吗?在此错误提示,在鼠标离开或切换的时候,切实可以进行相应的错误提示;
现在需求变了,如果是很多单选按钮组,需要至少选中一个怎么办了?如果不作任何修改,默认会在第一个按钮上tip提示为必填项,显然不能100%表达我们的意思;在上面的onError的js中,我判断了data-forerrortip这个属性,用法如下:
<span id="groupRadioError" style="vertical-align:middle;line-height:70px;"> </span>
@Html.ValidationMessageFor(m => m.Option, "", new{data_forErrorTip="groupRadioError" })
我定义一个空的span位置定义为自定义的位置,然后在ValidationMessageFor的时候加入一个自定义属性,指向我加入的空span的id,[有点label-for的意思],然后对比我们上面写的onError的js比较,意思就是错误的指向不是错误本身的元素对象而是data-forerrortip属性指向的id的元素进行错误提示

到目前为止,你任务提示完了吗?这只是进行了一半了,MVC是前台和后台可以同时验证的,现在说的都只是前台进行的验证,如果后台验证有错误咋办?仔细观察几遍,如果后台有错误,在Response的时候,是直接把错误放在span中给显示出来的;现在可以将validate、validate.unobtrusive注释掉,并且不采用ajax提交,注释掉ajax提交的js[jquery.unobtrusive-ajax],表单改为
@using (Ajax.BeginForm("SaveMemberUser", new { id = "Add" }, new AjaxOptions { Url = "/Home/SaveMemberUser/" }))
{
}
如此这般,空表单直接提交,就完全没看到tip的提示效果,因为有tip的提示已经被我们注释掉了;刚说到,span的错误是直接Response出来的

这样我们可以在页面刚加载完后就去找class为field-validation-error的样式进行each就可以了:
$(function () {
$(".field-validation-error").each(function () {
var $this = $(this);
var thisid = $this.attr("data-valmsg-for").replace(".", "_");
var direction = "right";
// 左边+元素宽+提示的文字+提示两边的空白
if (($this[0].offsetLeft + $this.width() + $this.text().length * 10 + 20) > $(document).width()) {
direction = "left";
}
$this.hide();
setTimeout(function () {
$("#" + thisid).poshytip({
content: $this.text(),
alignTo: 'target',
alignX: direction,
alignY: 'center',
showOn: 'none',
offsetX: 5
}).poshytip('show');
}, 100);
});
});
使用setTimeout来控制显示的原因,是因为在使用$();加载的时候,元素已经加载了,但元素的位置信息还未完成初始化,所以tip的位置不正确;还有一点,就是在tip提示的时候进行窗口的大小的拖动会导致tip的提示的延迟位置定位,及时拖动定位可以设置[refreshAniDuration:0]即可
小知识:
在进行监听$(window).resize(function(){dowork()}); 这样就会在整个拖动过程中导致dowork函数会被执行N次,显然我们只是想在拖动大小完成的时候执行一次就够了;可以用到事件的延迟执行,setTimeout;
function throttle(method, context) {
clearTimeout(method.tId);
method.tId = setTimeout(function () {
method.call(context);
}, 100);
}
使用的时候
$(window).resize(function(){ throttle(dowork) })
构建一个执行顺序,如果100内,有等待的,则取消,重新加载新的,这样只会在最后一次执行,当然你得控制事件间隔;
MVC与Validate验证提示的样式修改的更多相关文章
- html中input提示文字样式修改
在很多网站上我们都看到input输入框显示提示文字,让我们一起来看看如果在input输入框中显示提示文字.我们只需要在<input>标签里添加:placeholder="提示文字 ...
- ssm中通过ajax或jquer的validate验证原密码与修改密码的正确性
一.ajax 1. <script type="text/javascript"> //验证原密码1.ajax,正则 var ok1=false,ok2=false,o ...
- input 默认提示文字 样式修改(颜色,大小,位置)
input::-webkit-input-placeholder{ color:red; font-size:20px; ...... }
- ASP.NET MVC Jquery Validate 表单验证的多种方式
在我们日常开发过程中,前端的表单验证很重要,如果这块处理不当,会出现很多bug .但是如果处理的好,不仅bug会很少,用户体验也会得到很大的提升.在开发过程中我们可以不借助 JS 库,自己去手写 JS ...
- [转]ASP.NET MVC Jquery Validate 表单验证的多种方式介绍
在我们日常开发过程中,前端的表单验证很重要,如果这块处理不当,会出现很多bug .但是如果处理的好,不仅bug会很少,用户体验也会得到很大的提升.在开发过程中我们可以不借助 JS 库,自己去手写 JS ...
- mvc配合jquery.validate验证失效,情况之一
用viewbage绑定input空间的value值,通过submit提交.validate验证失效. 1.应该是mvc的渲染顺序导致js验证失败. 解决方案:改用mvc自带的@html辅助方法,生成文 ...
- 帆软报表(finereport)使用Event 事件对象 (target)修改提示框样式
target 事件属性 Event 对象 定义和用法 target 事件属性可返回事件的目标节点(触发该事件的节点),如生成事件的元素.文档或窗口. 语法 event.target 定义结束事件Jav ...
- 期货大赛项目|四,MVC的数据验证
上图先看下效果 样式先不说,先了解下数据验证是怎么实现的 一 必须是强类型的视图 二 这些显示提示的话语,都在强类型的实体中 三 必须使用Html.BeginForm或者Html.AjaxBeginF ...
- jQuery Validate验证框架详解
转自:http://www.cnblogs.com/linjiqin/p/3431835.html jQuery校验官网地址:http://bassistance.de/jquery-plugins/ ...
随机推荐
- Nio得知3——该示范基地:多路复用器模式
Reactor模式和NIO 本文可以看作是Doug Lea Scalable IO in Java一文的翻译. 当前分布式计算 Web Services盛行天下,这些网络服务的底层都离不开对socke ...
- 在域信任环境中使用 Team Foundation Server (TFS 2013)
原文:在域信任环境中使用 Team Foundation Server (TFS 2013) 1. 用户情景和方案: XX公司的大部分软件产品通过软件外包的方式由开发商完成.为加强对软件开发的进度和质 ...
- Linux访问Windows共享文件夹 (转)
在开发Linux程序中,经常会使用Windows的编辑器进行编辑,这样还要拷贝到Linux服务器,如果有这种开发习惯的同学,可以使用这种方式进行开发. 当然除了这种方法之外,可以再Windows安装n ...
- TextView——setCompoundDrawables说明
Drawable drawable = mContext.getResources().getDrawable(R.drawable.duringtime); drawable.setBounds( ...
- Xcode-5.1.1更改文件盯作者
原来的文件默认是用户开机时的username ,网上说什么改通讯录事实上都是不正确的. 1.首先打开偏好设置,选择用户群组 2.进入用户界面 改动全名.此时要求你输入用户的password才干改动us ...
- Node.js v0.10.31API手工-DNS
原版的API品种,这是从以前的翻译和翻译风格不同 Node.js v0.10.31API手冊-文件夹 DNS 使用 require('dns') 引入此模块. dns 模块中的全部方法都使用了 C-A ...
- 详细解释 集成Maven Spring Mybatis项目包生成Bat文件
有时在项目必须Maven项目包生成bat文件,长官一人.本文将解释的具体使用方法maven-assembly-plugin插件实现bat文件包. 1.首先看一下项目结构 2.配置pom.xml文件,在 ...
- printf 对齐
printf关于对其的问题(参考有关博客加上自己的一些总结) 1.关于左对齐或右对齐问题, 默认的如果%后没有“-”是右对齐的,如果%后跟“0”,不足的个数用0来填充, 例如:printf(&qu ...
- 使用Maven在Eclipse中创建Web项目[转]
一.新建 Maven Web项目 1.新建Maven Project new project-->选择 Maven Project --> 下一步 选择工作空间 -->下一步 在Fi ...
- C语言移位运算符
位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算.位移位运算符分为左移和右移两种,均为双目运算符.第一运算对象是移位对象,第二个运算对象是所移的二进制位数. 位移位运算符的运算对象 ...