我對用於在asp.net mvc中進行業務規則驗證的方法有疑問。在Asp.net MVC中使用異常驗證業務邏輯
目前,我有一個異常類,看起來像這樣
public class ValidationException : Exception
{
private ModelStateDictionary State { get; set; }
public ValidationException(ModelStateDictionary state)
{
State = state;
}
public void MergeModelStates(ModelStateDictionary state)
{
state.Merge(this.State);
}
}
和看起來像這樣
public void Validate(IEntity entity)
{
ModelStateDictionary state = new ModelStateDictionary();
if (entity.Contact != null && _service.GetBy(entity.Contact.Id) == null)
state.AddModelError("Contact", "Invalid Contact.");
if (entity.Title.Length > 8)
state.AddModelError("title", "Title is too long...");
... etc
if (!state.IsValid)
throw new ValidationException(state);
}
驗證器和控制器,做這樣的事情
public ActionResult Add()
{
var entity = new InputModel;
try
{
TryUpdateMode(inputModel);
..... Send input to a Repository (Repository calls Validate(entity);
}
catch (ValidationException validationException)
{
validationException.MergeModelStates(this.ModelState);
TryUpdateModel(inputModel);
return View("Add",inputModel);
}
return View("List");
}
使用異常來做這樣的事情是錯誤的嗎? 有更好方法的例子嗎?我真的不想將驗證添加到模型實體本身。我已經看到完成的唯一方法是將控制器模型狀態注入到存儲庫層,但對我來說似乎很渺茫。
感謝所有幫助
謝謝!這對我來說看起來更清潔,因爲ModelStateDictionary不在除控制器之外的任何其他類中使用。 從Save方法拋出而不是從validate方法拋出性能差異? 哦,一旦異常被拋出並被捕獲,我將需要調用驗證並獲取所有錯誤並將它們添加到模型狀態? – AlteredConcept 2009-10-28 15:01:22
好吧,我必須在控制器中再次驗證一次,並再次在保存方法中驗證。廢話我想在存儲庫層做我所有的驗證,但我想我也必須在控制器中做到這一點。哦,好吧..謝謝! – AlteredConcept 2009-10-28 19:51:54