一个或多个实体的验证失败.MVC

本文关键字:验证 失败 实体 MVC 一个 | 更新日期: 2023-09-27 18:09:12

当我试图通过动作CreateCommentCommentReview模型创建一行时,我得到以下错误。

一个或多个实体的验证失败。看到'EntityValidationErrors'属性获取更多详细信息。

我发送给模型的数据出错了,但我不知道是什么。我也尝试了(DbEntityValidationException e)方法没有成功,因为我不能使它与我的代码工作,因为我不是一个有经验的程序员和新的MVC。

下面的代码来自我的控制器:

// GET: Review/Create
[HttpGet]
public ActionResult CreateComment() {
    return View();
}
// POST: Review/Create
[HttpPost]
public ActionResult CreateComment(Guid? id) { 
    if (ModelState.IsValid)
    {        
        Guid userID = new Guid(Session["LoggedUserID"].ToString());            
        Guid reviewID = new Guid(id.ToString());

        CommentReview rComment = new CommentReview();
        rComment.UserId = userID;
        rComment.ReviewId = reviewID;
        rComment.CreatedDate = DateTime.Now;

        db.CommentReviews.Add(rComment);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View();
}

Model for CommentReview:

public System.Guid Id { get; set; }
public System.Guid UserId { get; set; }
public System.Guid ReviewId { get; set; }
public string Comment { get; set; }
public System.DateTime CreatedDate { get; set; }

如何向模型发送数据:

  • Id正在生成自己的Guid密钥
  • UserIDSession["LoggedUserID"]获取Id
  • Comment通过View
  • 创建
  • 其余部分通过控制器中的代码获取数据。

查看CreateComment的代码:

@model xxxx.CommentReview
@{
    ViewBag.Title = "CreateComment";
}
<h2>CreateComment</h2>
@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()
    <div class="form-horizontal">
        <h4>CommentReview</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.Comment, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Comment, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Comment, "", new { @class = "text-danger" })
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>

一个或多个实体的验证失败.MVC

由于您正在为评论编写评论,因此您应该在GET操作方法中接受评论id作为参数,创建CommentReviewVm类的对象并设置ReviewId属性并发送给视图。

所以你的视图模型将是

public class CommentReviewVm
{
  public Guid ReviewId { set;get;}
  [Required]
  public string Comment { set;get;}
}

在你的Action方法中

public ActionResult CreateComment(Guid id)
{
  return View(new CommentReviewVm { ReviewId=id});
}

因此,当有人来到这个GET操作时,他们需要传递Id(这是审查Id)。例:yourSiteName'Review'CreateComment'6ae6469d-8531-4bb6-8214-dbc65016288f

现在在你的视图中,你需要将这个ReviewId保存在一个隐藏的字段中,这样当你提交表单时,它将在HttpPost操作方法中可用。

@model CommentReviewVm
@using(Html.BeginForm())
{
  @Html.HiddenFor(s=>s.ReviewId) 
  @Html.LabelFor(f=>f.Comment)
  @Html.TextBoxFor(g=>g.Comment)
  <input type="submit" />
}

现在在你的HttpPost动作方法中,使用这个视图模型作为你的参数,读取值并使用它来保存

[HttpPost]
public ActionResult CreateComment(CommentReviewVm model)
{
  if(ModelState.IsValid)
  {
     var m = new CommentReview { Comment = model.Comment, ReviewId=model.ReviewId };
     m.userID = new Guid(Session["LoggedUserID"].ToString());       
     m.CreatedDate = DateTime.Now;
     db.CommentToReviews.Add(m);
     db.SaveChanges();
     return RedirectToAction("Index");
  }
  return View(model);
} 

我看到你在代码中手动设置了ReviewId(Guid)。我不确定你想要多大的价值。如果你在评论中添加评论,你应该在调用CreateComment动作方法时获得评论id(应该是url的一部分,正如我在第一段中解释的那样)。如果不是这样,请调整HttpPost操作方法以填充该值