实体框架和MVC3创建和更新模型

本文关键字:更新 模型 创建 MVC3 框架 实体 | 更新日期: 2023-09-27 17:58:20

因此,我使用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);
    }
}

现在没有帖子类型列表,只有标题,这就行了。然而,对于post类型,它不是。我得到"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失败了。

有什么想法吗?

实体框架和MVC3创建和更新模型

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

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

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

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

这将忽略PostType值。

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

public ActionResult Edit(Post post) {

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

相关文章: