我有自定義驗證問題。我有一個視圖模型:MVC自定義驗證被標準驗證覆蓋
public class CityViewModel
{
[ForeignKey(ErrorMessageResourceName = "County")]
public int CountyId { get; set; }
public string PostCode { get; set; }
}
我創建了一個名爲ForeignKey
一個自定義的驗證類,它包含以下代碼:
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true)]
public class ForeignKeyAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
PropertyInfo propretyInfo = validationContext.ObjectType.GetProperty(validationContext.MemberName);
ResourceManager manager = Resource.ResourceManager;
if (propretyInfo.PropertyType.IsGenericType && propretyInfo.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) {
if (value != null && (int)value == 0) {
return new ValidationResult(manager.GetString(ErrorMessageResourceName));
}
else {
return ValidationResult.Success;
}
}
else if (value == null || (int)value == 0) {
return new ValidationResult(manager.GetString(ErrorMessageResourceName));
}
return ValidationResult.Success;
}
}
這種方法效果很好,並返回正確的錯誤。問題是在我的控制器動作:
[HttpPost]
public ActionResult Create(DataSourceRequest request, CityViewModel model)
{
try {
if (ModelState.IsValid) {
// Some code
return Json(new[] { model }.ToDataSourceResult(request, ModelState));
}
}
catch (Exception e) {
// Some code
}
return Json(ModelState.ToDataSourceResult());
}
如果CountyId
爲空(果然是0,但在進入方法Create
可以爲空之前在驗證過程中)我ModelState
包含,CountyId
領域,這種錯誤「 CountyId字段是必需的。「而不是我的錯誤傳遞給ForeignKey
自定義屬性。
如果我用這個代碼:
TryValidateModel(model);
然後ModelState
包含兩個錯誤,因此調用TryValidateModel
之前,我應該使用:
ModelState["CountyId"].Errors.Clear();
我怎麼能對MVC說時不寫我的錯誤首先驗證?我更喜歡簡單地使用ModelState.IsValid
。任何人都可以幫助我?
您屬性'int'這意味着,使所需的驗證,首先執行它必須有一個值。如果你想返回你的錯誤信息,使屬性'int?'(可爲空) –
@StephenMuecke謝謝你的答案。我知道我可以設置屬性爲空,但我需要它是不可空的。我可以壓制'Required'驗證嗎? – erikscandola
你可以嘗試排除創建方法參數中的Id,例如: Create([Bind(Exclude =「Id」)],CityViewModel model) – ThrowingSpoon