2012-11-29 33 views
2

我最近創建了一個使用MVC4和EF5的新應用程序。這些表已經存在,所以我們首先使用數據庫。這對我來說都是新的,這是我第一次在MVC或EF。ValidationResult和ViewModels

我在我的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" /> 

的代碼工作正常,如果一切都在屏幕上正確,但在驗證失敗時,我沒有得到一個不錯的錯誤,我得到一個黃色的畫面。我相信我錯過了一些東西,我只是不知道是什麼。

回答

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