MVC开发过程中的疑难杂症
MVC使用客户端验证
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
微软的jquery.validate.unobtrusive 会导致 jquery.validate本身无法使用 为什么呢!操他妈的!因为微软这个杂种代码有问题!要怎么处理呢!
主要是我技术不行看不出原因!找了好久看到国外网站http://our.umbraco.org/forum/umbraco-pro/contour/43526-jqueryvalidateunobtrusive-conflict
答案:
Ok found a fix you'll need a custom version of the jquery validate unobtrusive script
Here is the updated version: https://www.dropbox.com/s/d3zww28c0zk66e6/jquery.validate.unobtrusive.js
Basicly it's an addon at line 100 since the jquery.validate.unobtrusive.js code calls form.validate() even if no rules were found or created - destroying whatever you had done, so by adding a simple check...
(!$.isEmptyObject(this.options.rules)) $form.validate(this.options); },
/// <reference path="jquery-1.4.4.js" />
/// <reference path="jquery.validate.js" />
/*!
** Unobtrusive validation support library for jQuery and jQuery Validate
** Copyright (C) Microsoft Corporation. All rights reserved.
*/
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global document: false, jQuery: false */
(
function
($) {
var
$jQval = $.validator,
adapters,
data_validation =
"unobtrusiveValidation"
;
function
setValidationValues(options, ruleName, value) {
options.rules[ruleName] = value;
if
(options.message) {
options.messages[ruleName] = options.message;
}
}
function
splitAndTrim(value) {
return
value.replace(/^\s+|\s+$/g,
""
).split(/\s*,\s*/g);
}
function
getModelPrefix(fieldName) {
return
fieldName.substr(0, fieldName.lastIndexOf(
"."
) + 1);
}
function
appendModelPrefix(value, prefix) {
if
(value.indexOf(
"*."
) === 0) {
value = value.replace(
"*."
, prefix);
}
return
value;
}
function
onError(error, inputElement) {
// 'this' is the form element
var
container = $(
this
).find(
"[data-valmsg-for='"
+ inputElement[0].name +
"']"
),
replace = $.parseJSON(container.attr(
"data-valmsg-replace"
)) !==
false
;
container.removeClass(
"field-validation-valid"
).addClass(
"field-validation-error"
);
error.data(
"unobtrusiveContainer"
, container);
if
(replace) {
container.empty();
error.removeClass(
"input-validation-error"
).appendTo(container);
}
else
{
error.hide();
}
}
function
onErrors(form, validator) {
// 'this' is the form element
var
container = $(
this
).find(
"[data-valmsg-summary=true]"
),
list = container.find(
"ul"
);
if
(list && list.length && validator.errorList.length) {
list.empty();
container.addClass(
"validation-summary-errors"
).removeClass(
"validation-summary-valid"
);
$.each(validator.errorList,
function
() {
$(
"<li />"
).html(
this
.message).appendTo(list);
});
}
}
function
onSuccess(error) {
// 'this' is the form element
var
container = error.data(
"unobtrusiveContainer"
),
replace = $.parseJSON(container.attr(
"data-valmsg-replace"
));
if
(container) {
container.addClass(
"field-validation-valid"
).removeClass(
"field-validation-error"
);
error.removeData(
"unobtrusiveContainer"
);
if
(replace) {
container.empty();
}
}
}
function
validationInfo(form) {
var
$form = $(form),
result = $form.data(data_validation);
if
(!result) {
result = {
options: {
// options structure passed to jQuery Validate's validate() method
errorClass:
"input-validation-error"
,
errorElement:
"span"
,
errorPlacement: $.proxy(onError, form),
invalidHandler: $.proxy(onErrors, form),
messages: {},
rules: {},
success: $.proxy(onSuccess, form)
},
attachValidation:
function
() {
if
(!$.isEmptyObject(
this
.options.rules))
$form.validate(
this
.options);
},
validate:
function
() {
// a validation function that is called by unobtrusive Ajax
$form.validate();
return
$form.valid();
}
};
$form.data(data_validation, result);
}
return
result;
}
$jQval.unobtrusive = {
adapters: [],
parseElement:
function
(element, skipAttach) {
/// <summary>
/// Parses a single HTML element for unobtrusive validation attributes.
/// </summary>
/// <param name="element" domElement="true">The HTML element to be parsed.</param>
/// <param name="skipAttach" type="Boolean">[Optional] true to skip attaching the
/// validation to the form. If parsing just this single element, you should specify true.
/// If parsing several elements, you should specify false, and manually attach the validation
/// to the form when you are finished. The default is false.</param>
var
$element = $(element),
form = $element.parents(
"form"
)[0],
valInfo, rules, messages;
if
(!form) {
// Cannot do client-side validation without a form
return
;
}
valInfo = validationInfo(form);
valInfo.options.rules[element.name] = rules = {};
valInfo.options.messages[element.name] = messages = {};
$.each(
this
.adapters,
function
() {
var
prefix =
"data-val-"
+
this
.name,
message = $element.attr(prefix),
paramValues = {};
if
(message !== undefined) {
// Compare against undefined, because an empty message is legal (and falsy)
prefix +=
"-"
;
$.each(
this
.params,
function
() {
paramValues[
this
] = $element.attr(prefix +
this
);
});
this
.adapt({
element: element,
form: form,
message: message,
params: paramValues,
rules: rules,
messages: messages
});
}
});
jQuery.extend(rules, {
"__dummy__"
:
true
});
if
(!skipAttach) {
valInfo.attachValidation();
}
},
parse:
function
(selector) {
/// <summary>
/// Parses all the HTML elements in the specified selector. It looks for input elements decorated
/// with the [data-val=true] attribute value and enables validation according to the data-val-*
/// attribute values.
/// </summary>
/// <param name="selector" type="String">Any valid jQuery selector.</param>
$(selector).find(
":input[data-val=true]"
).each(
function
() {
$jQval.unobtrusive.parseElement(
this
,
true
);
});
$(
"form"
).each(
function
() {
var
info = validationInfo(
this
);
if
(info) {
info.attachValidation();
}
});
}
};
adapters = $jQval.unobtrusive.adapters;
adapters.add =
function
(adapterName, params, fn) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
/// <param name="params" type="Array" optional="true">[Optional] An array of parameter names (strings) that will
/// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and
/// mmmm is the parameter name).</param>
/// <param name="fn" type="Function">The function to call, which adapts the values from the HTML
/// attributes into jQuery Validate rules and/or messages.</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
if
(!fn) {
// Called with no params, just a function
fn = params;
params = [];
}
this
.push({ name: adapterName, params: params, adapt: fn });
return
this
;
};
adapters.addBool =
function
(adapterName, ruleName) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
/// the jQuery Validate validation rule has no parameter values.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
/// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
/// of adapterName will be used instead.</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
return
this
.add(adapterName,
function
(options) {
setValidationValues(options, ruleName || adapterName,
true
);
});
};
adapters.addMinMax =
function
(adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
/// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and
/// one for min-and-max). The HTML parameters are expected to be named -min and -max.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
/// <param name="minRuleName" type="String">The name of the jQuery Validate rule to be used when you only
/// have a minimum value.</param>
/// <param name="maxRuleName" type="String">The name of the jQuery Validate rule to be used when you only
/// have a maximum value.</param>
/// <param name="minMaxRuleName" type="String">The name of the jQuery Validate rule to be used when you
/// have both a minimum and maximum value.</param>
/// <param name="minAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
/// contains the minimum value. The default is "min".</param>
/// <param name="maxAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
/// contains the maximum value. The default is "max".</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
return
this
.add(adapterName, [minAttribute ||
"min"
, maxAttribute ||
"max"
],
function
(options) {
var
min = options.params.min,
max = options.params.max;
if
(min && max) {
setValidationValues(options, minMaxRuleName, [min, max]);
}
else
if
(min) {
setValidationValues(options, minRuleName, min);
}
else
if
(max) {
setValidationValues(options, maxRuleName, max);
}
});
};
adapters.addSingleVal =
function
(adapterName, attribute, ruleName) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
/// the jQuery Validate validation rule has a single value.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).</param>
/// <param name="attribute" type="String">[Optional] The name of the HTML attribute that contains the value.
/// The default is "val".</param>
/// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
/// of adapterName will be used instead.</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
return
this
.add(adapterName, [attribute ||
"val"
],
function
(options) {
setValidationValues(options, ruleName || adapterName, options.params[attribute]);
});
};
$jQval.addMethod(
"__dummy__"
,
function
(value, element, params) {
return
true
;
});
$jQval.addMethod(
"regex"
,
function
(value, element, params) {
var
match;
if
(
this
.optional(element)) {
return
true
;
}
match =
new
RegExp(params).exec(value);
return
(match && (match.index === 0) && (match[0].length === value.length));
});
adapters.addSingleVal(
"accept"
,
"exts"
).addSingleVal(
"regex"
,
"pattern"
);
adapters.addBool(
"creditcard"
).addBool(
"date"
).addBool(
"digits"
).addBool(
"email"
).addBool(
"number"
).addBool(
"url"
);
adapters.addMinMax(
"length"
,
"minlength"
,
"maxlength"
,
"rangelength"
).addMinMax(
"range"
,
"min"
,
"max"
,
"range"
);
adapters.add(
"equalto"
, [
"other"
],
function
(options) {
var
prefix = getModelPrefix(options.element.name),
other = options.params.other,
fullOtherName = appendModelPrefix(other, prefix),
element = $(options.form).find(
":input[name="
+ fullOtherName +
"]"
)[0];
setValidationValues(options,
"equalTo"
, element);
});
adapters.add(
"required"
,
function
(options) {
// jQuery Validate equates "required" with "mandatory" for checkbox elements
if
(options.element.tagName.toUpperCase() !==
"INPUT"
|| options.element.type.toUpperCase() !==
"CHECKBOX"
) {
setValidationValues(options,
"required"
,
true
);
}
});
adapters.add(
"remote"
, [
"url"
,
"type"
,
"additionalfields"
],
function
(options) {
var
value = {
url: options.params.url,
type: options.params.type ||
"GET"
,
data: {}
},
prefix = getModelPrefix(options.element.name);
$.each(splitAndTrim(options.params.additionalfields || options.element.name),
function
(i, fieldName) {
var
paramName = appendModelPrefix(fieldName, prefix);
value.data[paramName] =
function
() {
return
$(options.form).find(
":input[name='"
+ paramName +
"']"
).val();
};
});
setValidationValues(options,
"remote"
, value);
});
$(
function
() {
$jQval.unobtrusive.parse(document);
});
}(jQuery));
MVC开发过程中的疑难杂症的更多相关文章
- [2014-09-21]如何在 Asp.net Mvc 开发过程中更好的使用Enum
场景描述 在web开发过程中,有时候需要根据Enum类型生成下拉菜单: 有时候在输出枚举类型的时候,又希望输出对应的更具描述性的字符串. 喜欢直接用中文的请无视本文 不多说,直接看代码. 以下代码借鉴 ...
- asp.net mvc开发过程中的一些小细节
现在做网站用mvc越来越普及了,其好处就不说了,在这里只记录一些很多人都容易忽视的地方. 引用本地css和js文件的写法 这应该是最不受重视的地方,有同事也说我有点小题大作,但我觉得用mvc还是得有一 ...
- 在Asp.Net Core MVC 开发过程中遇到的问题
1. Q: Razor视图中怎么添加全局模型验证消息 #### A:使用ModelOnly <div asp-validation-summary="ModelOnly" c ...
- spring mvc开发过程中的乱码问题
在保证jsp,xml,数据库,编辑器编码一致的情况下. 1,用户输入中文,后台接收到也是中文,但是保存到数据库时乱码, 解决方法: 链接数据库的url="jdbc:mysql://local ...
- asp.net MVC开发过程中,使用到的方法(内置方法及使用说明)
® 视图的返回使用案例: [HttpGet] [SupportFilter] public ActionResult UserTopic(string type, string TopPicId, s ...
- spring mvc开发过程知识点记录
给一个客户做的一个小项目,需求就是输入类似一个短网址http://dd.yy/xxxx然后跳转到另外一个域名下的图书文件.(实际很多短网址站都提供API供调用吧,不过客户需求是他自己建立一个短网址服务 ...
- Mvc 项目中使用Bootstrap以及基于bootstrap的 Bootgrid
官方地址参考http://www.jquery-bootgrid.com/Examples Bootgrid 是一款基于BootStrap 开发的带有查询,分页功能的列表显示组件.可以在像MVC中开发 ...
- 关于基于Linphone的视频通话Android端开发过程中遇到的问题
关于基于Linphone的视频通话Android端开发过程中遇到的问题 运用开源项目Linphone的SDK进行开发,由于是小组进行开发,我主要负责的是界面部分. 由于当时是初学Android开发,对 ...
- 【初学者指南】在ASP.NET MVC 5中创建GridView
介绍 在这篇文章中,我们将会学习如何在 ASP.NET MVC 中创建一个 gridview,就像 ASP.NET Web 表单中的 gridview 一样.服务器端和客户端有许多可用的第三方库,这些 ...
随机推荐
- IOS UITabelView的cell
一.Cell的重用原理 iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万个UITableViewCell对象的话,那将会耗尽iOS设备的内存.要解决该问题,需要重用 ...
- javascript笔记——js的阻塞特性[转载]
JS具有阻塞特性,当浏览器在执行js代码时,不能同时做其它事情,即<script>每次出现都会让页面等待脚本的解析和执行(不论JS是内嵌的还是外链的),JS代码执行完成后,才继续渲染页面. ...
- 开发者需要知道的11条HTML5小常识
#HTML5: The Missing Manual# 如果说HTML是一部电影,那HTML5就是一次大转折.HTML本来是不会活过21世纪的.官方Web标准组织W3C在1998年对HTML就已经撒手 ...
- 你早该这么玩Excel 读书笔记
1. Excel用来分析数据,至少要有一份原始数据和对于的分类汇总数据,这两种数据在一项任务中,应该是存放在同一个Excel文档中的,在书籍中,把他们叫做源数据表和分类汇总表.用户输入源数据表,根据相 ...
- [java学习笔记]java语言核心----面向对象之this关键字
一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理: 代表的是当前对象. this就是所在函数 ...
- JavaScript的语法要点 3 - Calling Context
上一篇讲了JavaScript的Scope Chain - 每一个函数都有一个scope chain与之关联,scope chain上有第一个对象维护着本地变量作为其属性.另外我们在JavaScrip ...
- javascript的setTimeout以及setInterval休眠问题。
前端码农们在做项目中时候,必定不可少的需要做到轮播效果.但是有些特殊的需求,比如: 需要做到第一个容器内容轮播滚动之后,第二个容器内部再轮播滚动,再第三个容器内容轮播滚动. 这时候我的一开始的思路是: ...
- discuz random函数
在研究邮箱非必填的过程中发现了个比较好用的random函数,在function_core.php中找到声明: function random($length, $numeric = 0) { $see ...
- DataSnap Demo:TFDConnection、最大连接数、客户端回叫功能、多线程模拟、压力测试等
一.限制最大连接数,并验证来访者用户身份: procedure TServerContainer1.DSServer1Connect( DSConnectEventObject: TDSConnect ...
- DB2 SQL 递归实现多行合并
最终效果 原始数据: 转换脚本: WITH post_a AS ( SELECT DISTINCT T.EMP_NO,S.CODE_ FROM inscndb.DTFMA000_EMP_POST T ...