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 一样.服务器端和客户端有许多可用的第三方库,这些 ...
随机推荐
- linux ubuntu vsftp 默认主目录
vi /etc/passwd 查看/ftp: 后面的目录就是默认目录 这是匿名用户的目录 --------------------------- 使用linux 别的用户,默认在/home/用户名 ...
- const define 定义常量的区别
1.用const定义常量在编译的时候,提供了类型安全检查,而define 只是简单地进行字符串的替换 2.const定义的常量,会分配相应的内存空间.而define没有分配空间,只是在程序中与处理的时 ...
- Layout.xml中控件的ID命名方式
控件 缩写 LayoutView lv RelativeView rv TextView tv Button btn ImageButton imgBtn ImageView mgView 或则 iv ...
- 【转】Android SDK Manager 更新方法
在Android SDK Manager Setting 窗口设置HTTP Proxy server和HTTP Proxy Port这个2个参数,分别设置为: HTTP Proxy server:mi ...
- Oracle管理基础
1.exp导出命令
- 操作xml文档的常用方式
1.操作XML文档的两种常用方式: 1)使用XmlReader类和XmlWriter类操作 XmlReader是基于数据流的,占用极少的内存,是只读方式的,所以速度极快.只能采用遍历的模式查找数据节点 ...
- 解决Ajax跨域问题:Origin xx is not allowed by Access-Control-Allow-Origin.
一:使用jsonp格式, 如jquery中ajax请求参数 dataType:'JSONP'. <html> <head> <title>title</t ...
- 解读Python内存管理机制
转自:http://developer.51cto.com/art/201007/213585.htm 内存管理,对于Python这样的动态语言,是至关重要的一部分,它在很大程度上甚至决定了Pytho ...
- js 根据当前星期做跳转(代码段)
var week = [6,0,1,2,3,4,5]; $('.HotShop_head .HotShop_tab:eq('+week[new Date().getDay()]+')').click( ...
- Django Tutorial 学习笔记
实际操作了Django入门教程中的范例,对一些细节有了更清晰的掌握.感觉只看文档不动手是不行的,只看文档没法真正掌握其中要素之间的关系,看了很多遍也不行,必须动手做了才能掌握.同时,这次练习在Ecli ...