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

时间:2016-09-28 01:40:25

标签: c# asp.net-mvc entity-framework

当我尝试通过操作CommentReviewCreateComment模型创建一行时,我收到了以下错误。

  

一个或多个实体的验证失败。看到   ' 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();
}

评论模型评论:

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>

1 个答案:

答案 0 :(得分:1)

由于您正在撰写评论的评论,您应该接受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操作方法以填充该值,