C# 4.0 ValidationResult和ViewModels
我最近创建了一个使用MVC4和EF5的新应用程序。这些表已经存在,所以我们首先使用数据库。这对我来说是全新的,这是我第一次参加MVC或EF 我的EMDX文件中有一些模型,其中一个模型继承了IValidatableObject,并在Validate函数中添加了一些代码。这工作正常,然后我将视图更改为使用ViewModel,现在我从validate中得到一个错误,我被难住了。它仍在调用我的验证函数,但不再将其发回屏幕,我只得到一个黄色屏幕 错误:C# 4.0 ValidationResult和ViewModels,c#-4.0,asp.net-mvc-4,entity-framework-5,C# 4.0,Asp.net Mvc 4,Entity Framework 5,我最近创建了一个使用MVC4和EF5的新应用程序。这些表已经存在,所以我们首先使用数据库。这对我来说是全新的,这是我第一次参加MVC或EF 我的EMDX文件中有一些模型,其中一个模型继承了IValidatableObject,并在Validate函数中添加了一些代码。这工作正常,然后我将视图更改为使用ViewModel,现在我从validate中得到一个错误,我被难住了。它仍在调用我的验证函数,但不再将其发回屏幕,我只得到一个黄色屏幕 错误: Validation failed for one
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
}
}
控制器:编辑功能:
[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
@LabelFor(model=>model.Name.Id)
@EditorFor(model=>model.Name.Id)
@Html.ValidationMessageFor(model=>model.Name.Id)
@LabelFor(model=>model.Name.Name)
@EditorFor(model=>model.Name.Name)
@Html.ValidationMessageFor(model=>model.Name.Name)
@LabelFor(model=>model.Name.Active)
@EditorFor(model=>model.Name.Active)
@Html.ValidationMessageFor(model=>model.Name.Active)
如果屏幕上的所有内容都正确,代码就可以正常工作,但是当验证失败时,我不会得到一个很好的错误,我会得到一个黄色屏幕。我肯定我错过了什么,我只是不知道是什么。终于解决了。IValidatableObject需要移动到ViewModel,以及它的逻辑 模型
public部分类名{//:IValidatableObject{//从这里删除IValidateableObject
公共int Id{get;set;}
公共字符串名称{get;set;}
公共bool活动{get;set;}
//整个方法都可以注释掉
//公共IEnumerable验证(ValidationContext ValidationContext){
//从逻辑上讲,这是可行的
//}
}
视图模型
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
}
}
公共类NamesVM:IValidatableObject{//将IValidatableObject添加到视图模型中
公共名称名称{get;set;}
//这个模型中的一些其他东西,但不是这个问题的一部分
//然后将验证逻辑移到这里
公共IEnumerable验证(ValidationContext ValidationContext){
//从逻辑上讲,这是可行的
}
}
@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" />
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
}
}