5

.NET MVC とコード ファースト EF を使用して、要求された機能を実装します。ビジネス オブジェクトは比較的複雑で、System.ComponentModel.DataAnnotations.IValidatableObjectビジネス オブジェクトの検証に使用します。
現在、データ注釈を使用せずに MVC ValidationSummary を使用して、ビジネス オブジェクトから検証結果を表示する方法を見つけようとしています。例(非常に単純化):

ビジネス オブジェクト:

    public class MyBusinessObject : BaseEntity, IValidatableObject
    {
        public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
           return Validate();
        }
        public IEnumerable<ValidationResult> Validate()
        {
           List<ValidationResult> results = new List<ValidationResult>();

           if (DealType == DealTypes.NotSet)
           {
                results.Add(new ValidationResult("BO.DealType.NotSet", new[] { "DealType" }));
           }

           return results.Count > 0 ? results.AsEnumerable() : null;
        }
    }

今、私のMVCコントローラには次のようなものがあります:

    public class MyController : Controller
    {
        [HttpPost]
        public ActionResult New(MyModel myModel)
        {
           MyBusinessObject bo = GetBoFromModel(myModel);
           IEnumerable<ValidationResult> result = bo.Validate();
           if(result == null)
           {
               //Save bo, using my services layer
               //return RedirectResult to success page
           }

           return View(myModel);
        }
    }

ビューでは、私は持っていHtml.ValidationSummary();ます。ValidationSummary に
渡すにはどうすればよいですか?IEnumerable<ValidationResult>

グーグルで答えを見つけようとしましたが、見つかったすべての例は、ビジネスオブジェクトではなくモデルでデータ注釈を使用して検証の概要を表示する方法を説明しています。

ありがとう

4

4 に答える 4

12

モデルに BusinessError などのプロパティを追加します

ビューで次のことを行います

  @Html.ValidationMessageFor(model => model.BusinessError)

次に、エラーが発生したときはいつでもコントローラーで次のことを行います

ModelState.AddModelError("BussinessError", your error)
于 2013-04-17T17:20:12.670 に答える
1

Entity Framework は、DbEntityValidationException検証エラーが発生した場合に をスローする必要があります。その後、例外を使用して、エラーを に追加できますModelState

try
{
     SaveChanges();
}
catch (DbEntityValidationException ex)
{
     AddDbErrorsToModelState(ex);
}
return View(myModel);

protected void AddDbErrorsToModelState(DbEntityValidationException ex)
{
     foreach (var validationErrors in ex.EntityValidationErrors)
     {
          foreach (var validationError in validationErrors.ValidationErrors)
          {
               ModelState.AddModelError(validationError.PropertyName, validationError.ErrorMessage);
          }
     }
}
于 2013-04-17T17:51:20.210 に答える
0

IEnumate の内容を渡し、Html.ValidationSummary を引き続き利用する方法の 1 つは、ModelState を更新することです。

ModelState を更新する方法については、ここで適切な議論を見つけることができます。

于 2013-04-17T17:20:38.677 に答える