我有一個實現IValidatableObject
包含字符串,另一個視圖模型的集合,像這樣一個視圖模型:驗證視圖模型後,定製模型綁定
public sealed class MainViewModel
{
public string Name { get; set; }
public ICollection<OtherViewModel> Others { get; set; }
}
我的驗證檢查在Others
每個對象對
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
foreach (var other in this.Others)
{
// validate or yield return new ValidationResult
}
}
因爲真正MainViewModel
我不得不創造出一個自定義的模型綁定的複雜結構的重新構建男:利用IValidatableObject
提供的合同不同的規則odel並將POST數據分配給相關組件。那我得到的問題是,什麼是越來越驗證導致在上下文級的驗證錯誤,因爲它違反了某些數據庫約束和我不知道我做錯了什麼 - 我認爲ModelState.IsValid
將在調用Validate
方法我的觀點模型,但似乎並沒有這樣下去。
我的模型綁定看起來是這樣的:
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
int modelId = (int)controllerContext.RouteData.Values["id"];
// query the database and re-build the components of the view model
// iterate the POST data and assign to the model where necessary
// should I be calling something here to validate the model before it's passed to the controller?
return model;
}
任何幫助表示讚賞!
Validator.TryValidateObject
OK,看來我有點接近。現在我可以讓我IValidatableObject
方法通過向運行以下命令以我的自定義模型綁定:
var validationResults = new HashSet<ValidationResult>();
var isValid = Validator.TryValidateObject(model, new ValidationContext(model, null, null), validationResults, true);
似乎Validator.TryValidateObject
調用驗證方法,最後一個參數設置爲true
導致它來驗證所有屬性。但是,我現在堅持要將validationResults
交給控制器,以便它們能夠以有意義的方式使用。
其中我需要將此代碼放在:控制器和操作以及模型聯編程序和其中?其實我得到這個錯誤,請幫助。 – Rajpurohit
@Rajpurohit你會把上面的代碼放到你的自定義模型聯編程序類中。 –
其實我已經這樣做了,但是感謝@保羅。 - :) – Rajpurohit