c# - 如何从表单中隐藏外键值

标签 c# .net asp.net-mvc-3 entity-framework foreign-keys

我的数据库中有一个名为 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/

相关文章:

c# - 获取加载程序集的根命名空间(程序集命名空间)

c# - VSIX-项目 : Unable to get current Workspace due to casting issues

c# - ServerConnection.Cancel 方法

c# - 使用 XML 获取所有同名元素的内容?

c# - 支持 IoC 的基类方法的接口(interface)声明

.net - 为什么在这种情况下我不需要将 int 转换为 string? (。网)

c# - 无法将 TuPle 列表绑定(bind)到 Razor 中的 DropDownList

c# - 如何实现接受匿名类型的 C# 扩展方法

asp.net-mvc - ASP.NET MVC-仅图像+经过身份验证的用户

.net - 如何将 PFX Task.Factory.StartNew 用于带有参数的 F# 函数?