asp.net mvc客户端验证
|
在阅读了有关该主题的 ScottGU’s blog post之后,我一直在修改ASP.net MVC中的客户端验证功能.使用System.Componentmodel.DataAnnotations属性非常容易,如下所示: [Required(ErrorMessage = "You must specify a reason")]
public string ReasonText { get; set; }
……但是如果你需要一些更复杂的东西会发生什么.如果您的Address类具有PostalCode和CountryCode字段,该怎么办?您可能希望根据每个国家/地区的不同正则表达式验证邮政编码. [0-9] {5}适用于美国,但加拿大需要另外一个. 我通过滚动自己的ValidationService类来解决这个问题,该类接受控制器的ModelState属性并相应地验证它.这在服务器端运行良好,但不适用于新的客户端验证. 在Webforms中,我会使用像JavaScript一样的控件,如RequiredFieldValidator或CompareValidator,然后使用CustomValidator来处理复杂的规则.这样我就可以在一个地方拥有所有的验证逻辑,并且我可以获得快速javascript验证的好处(90%的时间),同时我仍然可以获得服务器端验证的安全性作为支持. MVC中的等效方法是什么? 解决方法编辑:这假设您正在使用MVC 3.不幸的是我的代码是在VB.NET中,因为这是我在工作中必须使用的.为了使一切都能很好地与新的不显眼的验证相结合,您需要做一些事情.几个星期前我通过它们. 首先,创建一个继承自ValidationAttribute的自定义属性类.一个简单的RequiredIf属性类如下: Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations
<AttributeUsage(AttributeTargets.Field Or AttributeTargets.Property,AllowMultiple:=False,Inherited:=False)> _
Public NotInheritable Class RequiredIfAttribute
Inherits ValidationAttribute
Private Const _defaultErrorMessage As String = "'{0}' is required."
Private ReadOnly _dependentProperty As String
Private ReadOnly _targetValues As Object()
Public Sub New(dependentProperty As String,targetValues As Object())
MyBase.New(_defaultErrorMessage)
_dependentProperty = dependentProperty
_targetValues = targetValues
End Sub
Public Sub New(dependentProperty As String,targetValues As Object(),errorMessage As String)
MyBase.New(errorMessage)
_dependentProperty = dependentProperty
_targetValues = targetValues
End Sub
Public ReadOnly Property DependentProperty() As String
Get
Return _dependentProperty
End Get
End Property
Public ReadOnly Property TargetValues() As Object()
Get
Return _targetValues
End Get
End Property
Public Overrides Function FormatErrorMessage(name As String) As String
Return String.Format(Globalization.CultureInfo.CurrentUICulture,ErrorMessageString,name)
End Function
Protected Overrides Function IsValid(value As Object,context As ValidationContext) As ValidationResult
' find the other property we need to compare with using reflection
Dim propertyValue = context.ObjectType.GetProperty(DependentProperty).GetValue(context.ObjectInstance,Nothing).ToString()
Dim match = TargetValues.SingleOrDefault(Function(t) t.ToString().ToLower() = propertyValue.ToLower())
If match IsNot Nothing AndAlso value Is Nothing Then
Return New ValidationResult(FormatErrorMessage(context.DisplayName))
End If
Return Nothing
End Function
End Class
接下来,您需要实现验证器类.该类负责让MVC知道不显眼的验证库工作所需的客户端验证规则. Public Class RequiredIfValidator
Inherits DataAnnotationsModelValidator(Of RequiredIfAttribute)
Public Sub New(metaData As ModelMetadata,context As ControllerContext,attribute As RequiredIfAttribute)
MyBase.New(metaData,context,attribute)
End Sub
Public Overrides Function GetClientValidationRules() As IEnumerable(Of ModelClientValidationRule)
Dim rule As New ModelClientValidationRule() With {.ErrorMessage = ErrorMessage,.ValidationType = "requiredif"}
rule.ValidationParameters("dependentproperty") = Attribute.DependentProperty.Replace("."c,HtmlHelper.IdAttributeDotReplacement)
Dim first As Boolean = True
Dim arrayString As New StringBuilder()
For Each param In Attribute.TargetValues
If first Then
first = False
Else
arrayString.Append(",")
End If
arrayString.Append(param.ToString())
Next
rule.ValidationParameters("targetvalues") = arrayString.ToString()
Return New ModelClientValidationRule() {rule}
End Function
End Class
现在,您可以在Global.asax的应用程序启动方法中注册所有内容: DataAnnotationsModelValidatorProvider.RegisterAdapter(GetType(RequiredIfAttribute),GetType(RequiredIfValidator)) 这可以让你90%的方式.现在您只需要告诉JQuery validate和MS不显眼的验证层如何读取您的新属性: /// <reference path="jquery-1.4.1-vsdoc.js" />
/// <reference path="jquery.validate-vsdoc.js" />
/* javascript for custom unobtrusive validation
==================================================== */
(function ($) {
// this adds the custom "requiredif" validator to the jQuery validate plugin
$.validator.addMethod('requiredif',function (value,element,params) {
// the "value" variable must not be empty if the dependent value matches
// one of the target values
var dependentVal = $('#' + params['dependentProperty']).val().trim().toLowerCase();
var targetValues = params['targetValues'].split(',');
// loop through all target values
for (i = 0; i < targetValues.length; i++) {
if (dependentVal == targetValues[i].toLowerCase()) {
return $.trim(value).length > 0;
}
}
return true;
},'not used');
// this tells the MS unobtrusive validation layer how to read the
// HTML 5 attributes that are output for the custom "requiredif" validator
$.validator.unobtrusive.adapters.add('requiredif',['dependentProperty','targetValues'],function (options) {
options.rules['requiredif'] = options.params;
if (options.message) {
options.messages['requiredif'] = options.message;
}
});
} (jQuery));
希望这会有所帮助,这对于工作来说真的很痛苦. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-core – 如何在asp.net 5类库nuget包中包含视图
- asp.net-mvc-3 – MVC 3.0 RC创建新项目空引用错误
- ASP.NET MVC用户 – 您是否想念WebForms中的任何内容?
- asp.net-mvc – ASP.NET MVC视图模型命名约定
- asp.net – Favicon没有显示
- asp.net – 按Enter键时提交表单
- 如何从ASP.NET MVC中的窗体身份验证拦截401?
- asp.net – (客户端)禁用提交按钮的最佳方法是什么?
- asp.net – MVC 5使用旧表单身份验证而不是OWIN
- asp.net-mvc – 修改ActionFilter中的模型
- asp.net-mvc – 重定向页面的TempData?
- asp.net – .asp和.aspx页面之间的区别?
- ASP.NET Web部件:非IE浏览器中的拖放支持
- asp.net-membership – 使用SQL提供程序获取ASP.
- ASP.NET MVC与Facebook Connect模板项目
- asp.net-mvc – 使用Automapper更新现有的实体PO
- ASP.NET MVC全能路由
- asp.net-mvc – 允许asp.net mvc 2控制器名称的U
- asp.net – 发布管理 – 发布给用户的一小部分 –
- asp.net-mvc-3 – ASP.NET MVC DropDownListFor从
