Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 ValidationResult和ViewModels_C# 4.0_Asp.net Mvc 4_Entity Framework 5 - Fatal编程技术网

C# 4.0 ValidationResult和ViewModels

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

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

我的EMDX文件中有一些模型,其中一个模型继承了IValidatableObject,并在Validate函数中添加了一些代码。这工作正常,然后我将视图更改为使用ViewModel,现在我从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
  }
}
控制器:编辑功能:

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