【问题标题】:Entity Framework and MVC3 Create and Update Model实体框架和 MVC3 创建和更新模型
【发布时间】:2011-09-08 10:21:55
【问题描述】:

所以我使用 EF Code First 成功创建了我的实体并查询数据库以显示项目。

我现在想提供一种编辑记录的方法。

我有一个 Post 类,其中包含:

(TypeName = "varchar")]
[Required()]
public string Headline { get; set; }

public virtual PostType PostType { get; set; }

PostType 是我编写的一个类,它有一个 ID 和名称,用于将帖子分类为新闻、博客等。

现在,在我的编辑控制器中,我得到了帖子并将其传递给视图模型中的视图。我还得到了不同帖子类型的 IEnumerable。

在我看来,我使用以下内容:

<div class="formFieldContainer">
    @Html.LabelFor(model => model.Post.PostType)
    @Html.DropDownListFor(model => model.Post.PostType, new SelectList(Model.PostTypes, "ID", "Name"))
    @Html.ValidationMessageFor(model => model.Post.PostType)
</div>

<div class="formFieldContainer">
    @Html.LabelFor(model => model.Post.Headline)
    @Html.EditorFor(model => model.Post.Headline)
    @Html.ValidationMessageFor(model => model.Post.Headline)
</div>

在我的编辑控制器上,我有以下内容来处理帖子:

[HttpPost, ValidateAntiForgeryToken, ValidateInput(false)]
public ActionResult Edit(int id, FormCollection collection) {
    var model = new PostViewModel();
    model.Post = _pr.GetPost(id); //gets the post from my post repository
    model.PostTypes = _ptr.GetPostTypes();

    try {
        UpdateModel(model.Post, "Post");
        _pr.Save();
        return RedirectToRoute("Posts", new { pageNumber = 0 }); //for now go to the homepage
    } catch (Exception e) {
        ModelState.AddModelError("_FORM", e.Message);
        return View(model);
    }
}

现在没有帖子类型列表,只有标题可以正常工作。但是,对于帖子类型,它不会。我得到“1 无效”(1 是选择列表的值),这是有道理的,因为我的 Post 模型需要一个 PostType 对象,而不是 int。

我想过做类似的事情:

model.Post.PostType = model.PostTypes.Where(x => x.ID == Int32.Parse(collection.GetValues("Post.PostType")[0])).Select(p => p).FirstOrDefault();

但是 1)它不起作用,所以它显然不是正确的方法,2)由于“Post.PostType”仍然存在,UpdateModel 失败。

关于如何做到这一点的任何想法?

【问题讨论】:

  • 不起作用是什么意思?没有细节就帮不上忙。
  • 另一个 PostType 被添加到数据库中!它应该是现有的,但每次都在创建一个新的。

标签: c# asp.net asp.net-mvc-3 entity-framework-4 ef-code-first


【解决方案1】:

尝试更改您的操作以在 Post 对象中执行:

public ActionResult Edit(Post post) {

对于 MVC 3、EF 4,post 对象应该从表单变量中填充,包括您的 PostType。然后调用你的更新和保存方法。

【讨论】:

  • 试过了,但我有同样的问题。我认为原因是我没有将 PostType 发布回编辑功能。它只是选择框中的一个 int,所以它无法知道要使用什么 PostType。
【解决方案2】:

我假设您的存储库 _pr 和 _ptr 使用不同的上下文?实体框架必须从相同的上下文中读取和更新。由于您从另一个上下文获取帖子类型,因此 EF 将其视为一个新实体,因此数据库中的额外行。

您应该在存储库之间共享您的上下文,每个请求的会话是事实上的最佳实践。

至于更新模型函数,您可以传入属性的字符串数组以包含在更新中:

UpdateModel(model.Post, "Post", new string[] { "Headline" });

这将忽略 PostType 值。

【讨论】:

  • 这确实是问题所在。我会根据请求的想法查看会话。我假设我可以转换我所做的并使用史蒂夫建议的编辑(发布帖子)想法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多