如果没有jQuery将字段validation为URL,如何在MVC4中使用type =“url”?

情况就是这样:我在这里有一个很棒的大文本输入框: https : //asafaweb.com

这不需要遵守URL的严格定义; 我允许没有方案的地址然后默认为HTTP用于可用性目的。 例如,“stackoverflow.com”将被视为有效的URL。 但是也有一些我不希望出于各种原因允许的URL(即它们已被列入黑名单或者它们是内部IP地址范围)。

我想将输入的类型设置为“url”而不是默认的“text”,以便移动设备上的用户获得为URL上下文设计的键盘(即iOS为您提供“.com”按钮),问题是一旦我这样做,与ASP.NET MVC捆绑在一起的默认不显眼的jQueryvalidation需要一个带有方案的URL,从而打破了我的无方案URL支持。

这是一个MVC4站点,我有一个HTML帮助器,如下所示:

@Html.TextBoxFor(m => m.ScanUrl, new { type = "url" }) 

然后,ScanUrl属性具有自定义ValidationAttribute,它执行所有定制检查以确保可以扫描URL。

如何在没有jQueryvalidation插入的情况下保留现有的validation模式,并且想要确保URL是一个严格的 URL?

如果您不需要在此站点中的任何位置进行严格的URLvalidation,则修改jQuery ValidationvalidationURL的方式可能是处理该问题的最简单方法。 如果您使用的是MVC 4附带的版本,您将在jquery.validate.js的第1034行找到它。

你可以在插件脚本中调整正则表达式,或者你可以在加载jQueryvalidation后修补urlvalidation方法:

   

之后修补它的主要优点是你不依赖于你的调整版本的脚本,并且可以在以后更新jQuery Validation本身,而不会丢失你的自定义urlvalidation器。 这对您来说可能是显而易见的,但可能对其他人稍后找到这个答案有所帮助。

如果焦点输出/更改不存在,您可以使用javascript自动将模式添加到输入中的URL。

您还可以告诉jQuery Validation插件根据您指定的选择器选择性地忽略输入字段,这可能是您要添加到要忽略的所有元素的class="ignorejQueryValidate" ,例如class="ignorejQueryValidate" ,或者在您的情况下,所有输入都是type="url"

请参阅Validation插件的validate()方法中jQuery文档中的ignore选项部分。

 @using (Html.BeginForm("SomeAction", "SomeController", FormMethod.Post, new { id = "myForm"})) { @Html.TextBoxFor(m => m.ScanUrl, new { type = "url", @class = "ignorejQueryValidate" }) } $("#myForm").validate({ ignore: ".ignorejQueryValidate" }); 

要么

 @using (Html.BeginForm("SomeAction", "SomeController", FormMethod.Post, new { id = "myForm" })) { @Html.TextBoxFor(m => m.ScanUrl, new { type = "url" }) } $("#myForm").validate({ ignore: "input[type=url]" });