我是新來的MVC和我通過一些驗證工作對象的屬性的總和。我已經在模型級別完成了基本的字段驗證(必需的,範圍等)。我現在正在研究一個基本上用權重來構建記分卡的頁面。我需要每一個權重爲每個標準加起來爲1驗證在ASP.NET MVC 4 - 驗證
我不知道我是否可以驗證這個模型,因爲我需要在數據庫中創建這些對象,因爲它們是能力添加。在用戶進入下一步之前,如何驗證這些屬性中的每個屬性合計爲1?
我是新來的MVC和我通過一些驗證工作對象的屬性的總和。我已經在模型級別完成了基本的字段驗證(必需的,範圍等)。我現在正在研究一個基本上用權重來構建記分卡的頁面。我需要每一個權重爲每個標準加起來爲1驗證在ASP.NET MVC 4 - 驗證
我不知道我是否可以驗證這個模型,因爲我需要在數據庫中創建這些對象,因爲它們是能力添加。在用戶進入下一步之前,如何驗證這些屬性中的每個屬性合計爲1?
基本上是後端,你需要創建一個可以被用做在該領域的屬性來驗證自定義驗證。
這是檢查,如果「數比另一種更大的日提交的」驗證的一個例子。
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class NumberGreaterThanAttribute : ValidationAttribute, IClientValidatable
{
string otherPropertyName;
public NumberGreaterThanAttribute(string otherPropertyName, string errorMessage)
: base(errorMessage)
{
this.otherPropertyName = otherPropertyName;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
ValidationResult validationResult = ValidationResult.Success;
if (value == null)
return validationResult;
try
{
// Using reflection we can get a reference to the other date property, in this example the project start date
var otherPropertyInfo = validationContext.ObjectType.GetProperty(this.otherPropertyName);
object referenceProperty = otherPropertyInfo.GetValue(validationContext.ObjectInstance, null);
if (referenceProperty == null)
return validationResult;
double referenceProperty_value = System.Convert.ToDouble(referenceProperty, null);
double currentField_value = System.Convert.ToDouble(value, null);
if (currentField_value <= referenceProperty_value)
{
validationResult = new ValidationResult(ErrorMessageString);
}
}
catch (Exception ex)
{
throw ex;
}
return validationResult;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
//string errorMessage = this.FormatErrorMessage(metadata.DisplayName);
string errorMessage = ErrorMessageString;
// The value we set here are needed by the jQuery adapter
ModelClientValidationRule numberGreaterThanRule = new ModelClientValidationRule();
numberGreaterThanRule.ErrorMessage = errorMessage;
numberGreaterThanRule.ValidationType = "numbergreaterthan"; // This is the name the jQuery adapter will use
//"otherpropertyname" is the name of the jQuery parameter for the adapter, must be LOWERCASE!
numberGreaterThanRule.ValidationParameters.Add("otherpropertyname", otherPropertyName);
yield return numberGreaterThanRule;
}
}
記住:對於自定義/新創建的驗證,前端驗證不會自動啓用。如果您想爲前端創建相同的驗證規則,則需要創建一個新的前端自定義驗證。我通常使用validate.js庫作爲前端。不過,如果您不介意將數據從服務器推送到客戶端,特別是在數據量較小的情況下,前端驗證並不是嚴格要求(但我會建議使用它)。當後端接收到該請求(通常爲POST)
的視圖模型/型號將被接收和解析由ModelState中。
public Int64? AtomicQtyMultiplePurchaseMin { get; set; }
[NumberGreaterThanAttribute("AtomicQtyMultiplePurchaseMin", "Must be greater than min num. qty. of purchase")]
public Int64? AtomicQtyMultiplePurchaseMax { get; set; }
我一般把自定義的驗證類在以下文件夾(但你可以把它放在你的項目想):該模型/視圖模型應該在需要驗證作爲這樣的領域進行裝飾
您可以創建自定義驗證。 – Luther
我的第一個想法是在你的ViewModel上使用一個IValidatableObject接口,它爲你提供了一種編寫自定義代碼的方法,它可以像屬性驗證代碼一樣創建驗證錯誤。 http://stackoverflow.com/questions/3400542/how-do-i-use-ivalidatableobject – Graham