【问题标题】:How to hide foreign key values from forms如何从表单中隐藏外键值
【发布时间】:2012-05-23 18:51:59
【问题描述】:

我的数据库中有一个名为 Review 的表,我使用实体框架制作了具有读/写操作和视图的 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() 上收到此错误:

无法插入外键值,因为对应的主键值不存在。 [外键约束名称 = 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;

【问题讨论】:

  • 如果我们的解决方案对您有帮助,请告诉我们
  • 这是一个新问题,您需要就新错误的细节提出一个新问题

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


【解决方案1】:

除了 cd smith 的非常好的建议,如果你不想用这种方式装饰你的 viewmodel,你也可以添加一个隐藏字段,看起来像这样:

@Html.HiddenFor(x => x.Review_UserID)

等,等等,用于您希望在表单上拥有但不可见的每个 FK。当然,这类似于 [ScaffoldColumn(false)] 装饰器的工作方式,当然,添加 [HiddenInput(DisplayValue = false)] 属性会为您显式完成此操作。

【讨论】:

  • 他实际上有那个隐藏字段,我得到的印象是他也不想在源代码中包含它......但谢谢!我投了你一票!
  • cd - 哦,是的,我也看到了。好的,也许[HiddenInput(DisplayValue = false)][ScaffoldColumn(false)] 可能对他有用。进行了小提示编辑
  • 我同意,我不知道[HiddenInput(DisplayValue = false)] 属性,谢谢,我会记住的
【解决方案2】:

在您的 ViewModel 中使用此注释您的属性,您不希望模板在视图中自动生成列

[ScaffoldColumn(false)]
public int ReviewID;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 2010-10-11
    • 2011-07-27
    • 2012-04-24
    • 2010-09-30
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多