一个或多个实体的验证失败.MVC
本文关键字:验证 失败 实体 MVC 一个 | 更新日期: 2023-09-27 18:09:12
当我试图通过动作CreateComment
为CommentReview
模型创建一行时,我得到以下错误。
一个或多个实体的验证失败。看到'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密钥 -
UserID
从Session["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>
由于您正在为评论编写评论,因此您应该在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操作方法以填充该值