2

我最近创建了一个使用 MVC4 和 EF5 的新应用程序。表已经存在,所以我们首先使用数据库。这对我来说是全新的,这是我第一次接触 MVC 或 EF。

我的 EMDX 文件中有一些模型,其中一个模型继承了 IValidatableObject 并将一些代码放入 Validate 函数中。这工作正常,然后我将视图更改为使用 ViewModel,现在我从验证中收到错误,我很难过。它仍在调用我的验证功能,但不再将其发布回屏幕,我只是得到一个黄色屏幕。

错误:

Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

模型:

public partial class Names : IValidatableObject {
  public int Id { get; set; }
  public string Name { get; set; }
  public bool Active { get; set; }

  public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
    // some logic, this works
  }
}

视图模型:

public class NamesVM {
  public Names Name { get; set; }
  // some other stuff in this model, but not part of this problem
}

控制器:编辑功能:

[HttpPost]
public ActionResult Edit(NamesVM nvm) {

  if (ModelState.IsValid) {
    dbCommon.Entry(nvm.Name).State = EntityState.Modified;
    dbCommon.SaveChanges();
    return RedirectToAction("Index");
  }

  return View(nvm);
}

看法:

@model NamesVM
<div class="editor-label">
  @Html.LabelFor(model => model.Name.Id)
</div>
<div class="editor-field">
  @Html.EditorFor(model => model.Name.Id)
  @Html.ValidationMessageFor(model => model.Name.Id)
</div>

<div class="editor-label">
  @Html.LabelFor(model => model.Name.Name)
</div>
<div class="editor-field">
  @Html.EditorFor(model => model.Name.Name)
  @Html.ValidationMessageFor(model => model.Name.Name)
</div>

<div class="editor-label">
  @Html.LabelFor(model => model.Name.Active)
</div>
<div class="editor-field">
  @Html.EditorFor(model => model.Name.Active)
  @Html.ValidationMessageFor(model => model.Name.Active)
</div>
<input type="submit" value="Save" />

如果屏幕上的一切都正确,则代码可以正常工作,但是当验证失败时,我没有收到一个很好的错误,我得到一个黄色屏幕。我确定我错过了一些东西,我只是不知道是什么。

4

1 回答 1

0

终于解决了。IValidatableObject 需要移动到 ViewModel,以及它的逻辑。

模型

public partial class Names { //: IValidatableObject { //Remove the IValidateableObject from here
    public int Id { get; set; }
    public string Name { get; set; }
    public bool Active { get; set; }

    // this whole method can be commented out
    //public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
        // some logic, this works
    //}
}

查看模型

public class NamesVM : IValidatableObject { // add the IValidatableObject to your view model
    public Names Name { get; set; }
        // some other stuff in this model, but not part of this problem

    // and move your validation logic to here
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
        // some logic, this works
    }
}
于 2012-12-06T13:54:16.133 回答