MVCvalidation低于/高于其他值
如何在MVC.Net中validation模型的最佳方法,我希望接受最小/最大值。
不是字段的单个最小值/最大值。 但是用户指定最小/最大值的单独字段。
public class FinanceModel{ public int MinimumCost {get;set;} public int MaximumCost {get;set;} }
所以我需要确保MinimumCost始终小于最大成本。
您可以使用自定义validation属性,这是我的日期示例。 但是你也可以使用它。
首先,这是模型:
public DateTime Beggining { get; set; } [IsDateAfterAttribute("Beggining", true, ErrorMessageResourceType = typeof(LocalizationHelper), ErrorMessageResourceName = "PeriodErrorMessage")] public DateTime End { get; set; }
这是属性本身:
public sealed class IsDateAfterAttribute : ValidationAttribute, IClientValidatable { private readonly string testedPropertyName; private readonly bool allowEqualDates; public IsDateAfterAttribute(string testedPropertyName, bool allowEqualDates = false) { this.testedPropertyName = testedPropertyName; this.allowEqualDates = allowEqualDates; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { var propertyTestedInfo = validationContext.ObjectType.GetProperty(this.testedPropertyName); if (propertyTestedInfo == null) { return new ValidationResult(string.Format("unknown property {0}", this.testedPropertyName)); } var propertyTestedValue = propertyTestedInfo.GetValue(validationContext.ObjectInstance, null); if (value == null || !(value is DateTime)) { return ValidationResult.Success; } if (propertyTestedValue == null || !(propertyTestedValue is DateTime)) { return ValidationResult.Success; } // Compare values if ((DateTime)value >= (DateTime)propertyTestedValue) { if (this.allowEqualDates && value == propertyTestedValue) { return ValidationResult.Success; } else if ((DateTime)value > (DateTime)propertyTestedValue) { return ValidationResult.Success; } } return new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); } public IEnumerable GetClientValidationRules(ModelMetadata metadata, ControllerContext context) { var rule = new ModelClientValidationRule { ErrorMessage = this.ErrorMessageString, ValidationType = "isdateafter" }; rule.ValidationParameters["propertytested"] = this.testedPropertyName; rule.ValidationParameters["allowequaldates"] = this.allowEqualDates; yield return rule; }
有一个名为Foolproof的NuGet包,它为您提供这些注释。 也就是说 – 编写自定义属性既简单又好。
使用Foolproof看起来像:
public class FinanceModel{ public int MinimumCost {get;set;} [GreaterThan("MinimumCost")] public int MaximumCost {get;set;} }
对于使用allowEqualDates和propertyTested参数的客户端validation(补充上面的Boranas答案,但评论太长):
// definition for the isdateafter validation rule if ($.validator && $.validator.unobtrusive) { $.validator.addMethod('isdateafter', function (value, element, params) { value = Date.parse(value); var otherDate = Date.parse($(params.compareTo).val()); if (isNaN(value) || isNaN(otherDate)) return true; return value > otherDate || (value == otherDate && params.allowEqualDates); }); $.validator.unobtrusive.adapters.add('isdateafter', ['propertytested', 'allowequaldates'], function (options) { options.rules['isdateafter'] = { 'allowEqualDates': options.params['allowequaldates'], 'compareTo': '#' + options.params['propertytested'] }; options.messages['isdateafter'] = options.message; }); }
更多信息: 不显眼的validation , jqueryvalidation
在VB中为整数:
模型
Public Property PropertyNameNumberEnds As Nullable(Of Integer)
validation
Public Class IsIntegerGreatherOrEqualThan Inherits ValidationAttribute Private otherPropertyName As String Private errorMessage As String Public Sub New(ByVal otherPropertyName As String, ByVal errorMessage As String) Me.otherPropertyName = otherPropertyName Me.errorMessage = errorMessage End Sub Protected Overrides Function IsValid(thisPropertyValue As Object, validationContext As ValidationContext) As ValidationResult Dim otherPropertyTestedInfo = validationContext.ObjectType.GetProperty(Me.otherPropertyName) If (otherPropertyTestedInfo Is Nothing) Then Return New ValidationResult(String.Format("unknown property {0}", Me.otherPropertyName)) End If Dim otherPropertyTestedValue = otherPropertyTestedInfo.GetValue(validationContext.ObjectInstance, Nothing) If (thisPropertyValue Is Nothing) Then Return ValidationResult.Success End If '' Compare values If (CType(thisPropertyValue, Integer) >= CType(otherPropertyTestedValue, Integer)) Then Return ValidationResult.Success End If '' Wrong Return New ValidationResult(errorMessage) End Function End Class
为什么不使用Range Validator。 句法:
[Range(typeof(int), "0", "100", ErrorMessage = "{0} can only be between {1} and {2}")] public int Percentage { get; set; }
- 在ASP.net MVC单页面应用程序中删除身份validation
- 如何在c#MVC身份validation中获取google plus个人资料图片
- ASP.NET MVC3从部分视图上载文件(并填充模型中的相应字段)
- 完整插入/更新/删除entity framework中的子实体
- VS2013 vs VS2015 CPU使用率
- 将Asp.net应用程序更新为Npgsql 3并删除Preload Reader
- 传递到字典中的模型项的类型为’System.Data.Entity.Infrastructure.DbQuery’,但此字典需要B类型的模型项
- 在静态资产和基于CDN的资产之间切换以进行开发和部署的最佳方法
- 何时在MVC中使用哪种类型的成员资格的一般规则