2

最近、MVC4とEF5を使用する新しいアプリケーションを作成しました。テーブルはすでに存在しているため、最初にデータベースを使用しています。これは私にとってまったく新しいことであり、MVCまたはEFでの初めてのことです。

EMDXファイルにいくつかのモデルがあり、そのうちの1つで、IValidatableObjectを継承し、Validate関数にいくつかのコードを配置しました。これは正常に機能していましたが、ViewModelを使用するようにビューを変更しましたが、validateからエラーが発生し、困惑しました。まだvalidate関数を呼び出していますが、画面にポストバックしなくなり、黄色の画面が表示されます。

エラー:

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
  }
}

ViewModel:

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 に答える