我的数据库中有一个名为 Review 的表,我使用 Entity Framework 创建了具有读/写操作和 View 的 ReviewController。所以都是脚手架代码。
这是我的编辑页面。
@model UniversityApp.Models.Review
@{
ViewBag.Title = "Edit";
}
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>Review</legend>
@Html.HiddenFor(model => model.ReviewID)
<div class="editor-label">
@Html.LabelFor(model => model.MovieID, "Movie")
</div>
<div class="editor-field">
@Html.DropDownList("MovieID", String.Empty)
@Html.ValidationMessageFor(model => model.MovieID)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.UserID, "User")
</div>
<div class="editor-field">
@Html.DropDownList("UserID", String.Empty)
@Html.ValidationMessageFor(model => model.UserID)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Rating)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Rating)
@Html.ValidationMessageFor(model => model.Rating)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Description)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Description)
@Html.ValidationMessageFor(model => model.Description)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
如您所见,脚手架机制为外值键添加了编辑器。我不希望用户在进行评论后能够手动更改用户 ID 或电影 ID,因此我删除了这段代码。但是在编辑评论条目时,我在数据库 SaveChanges() 上收到此错误:
A foreign key value cannot be inserted because a corresponding primary key value does not exist. [ Foreign key constraint name = Review_User ]
为了保留旧的用户 ID 和电影 ID 值,我应该在我的编辑操作中做什么?
这是 ReviewController 中编辑操作的代码:
public ActionResult Edit(int id)
{
Review review = db.Reviews.Find(id);
ViewBag.MovieID = new SelectList(db.Movies, "MovieID", "Title", review.MovieID);
ViewBag.UserID = new SelectList(db.Users, "UserID", "UserName", review.UserID);
return View(review);
}
[HttpPost]
public ActionResult Edit(Review review)
{
if (ModelState.IsValid)
{
db.Entry(review).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.MovieID = new SelectList(db.Movies, "MovieID", "Title", review.MovieID);
ViewBag.UserID = new SelectList(db.Users, "UserID", "UserName", review.UserID);
return View(review);
}
编辑:
我已经尝试了描述的方法,但我仍然遇到问题。现在我得到的错误信息是这样的: 发生引用完整性约束违规:定义引用约束的属性值在关系中的主体和依赖对象之间不一致。我不知道我做错了什么。错误是在这行代码上触发的:
db.Entry(review).State = EntityState.Modified;
最佳答案
除了 cd smith 的非常好的建议之外,如果您不想以这种方式装饰您的 View 模型,您还可以添加一个隐藏字段,这看起来像:
@Html.HiddenFor(x => x.Review_UserID)
等等,对于您希望在表单上具有但不可见的每个 FK。当然,这类似于 [ScaffoldColumn(false)]
装饰器的工作方式,不过添加 [HiddenInput(DisplayValue = false)]
属性明确地为你。
关于c# - 如何从表单中隐藏外键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10726095/