【问题标题】:.net mvc 3 create and edit.net mvc 3 创建和编辑
【发布时间】:2013-05-19 06:01:43
【问题描述】:

我一直在努力创建和编辑一个模型,该模型包含另一个模型作为其模型的一部分。

SubCategory 包含 Category 作为变量,因为它需要能够引用回它。

现在我通过 ViewBag 将视图公开到类别列表并将其绑定到下拉列表(模型 => model.Category.ID、新 SelectBox .. 等)解决了创建部分:

    public ActionResult Create()
    {
        ViewBag.Categories = db.Category.ToList();
        return View();
    } 

    [HttpPost]
    public ActionResult Create(SubCategory subcategory)
    {
        subcategory.Category = db.Category.Single(x => x.ID == subcategory.Category.ID);
        if (ModelState.IsValid)
        {
            db.SubCategory.Add(subcategory);
            db.SaveChanges();
            return RedirectToAction("Index");  
        }

        return View(subcategory);
    }

如您所见,我必须在上面进行快速修复以使子类别正确绑定到类别(在 DB 子类别中作为具有 CategoryID 的列)。

现在,当我尝试对编辑功能进行相同操作时,它不起作用。以下是我的编辑代码:

    public ActionResult Edit(int id)
    {
        ViewBag.Categories = db.Category.ToList();
        SubCategory subcategory = db.SubCategory.Find(id);
        return View(subcategory);
    }

    [HttpPost]
    public ActionResult Edit(SubCategory subcategory)
    {
        subcategory.Category = db.Category.Single(x => x.ID == subcategory.Category.ID);
        if (ModelState.IsValid)
        {
            UpdateModel(subcategory);
            db.Entry(subcategory).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(subcategory);
    }

如您所见,与创建方法相同,使用断点我看到 subcategory.Category 已正确填充,但由于某种原因它不保存状态,并且在页面重新加载后对 CategoryID 的引用是不变。

任何想法或帮助将不胜感激,谢谢。

更新

   [HttpPost]
    public ActionResult Edit(SubCategory subcategory)
    {
        subcategory.Category = db.Category.Single(x => x.ID == subcategory.Category.ID);
        if (ModelState.IsValid)
        {
            db.SubCategory.Single(x => x.ID == subcategory.ID).Name = subcategory.Name;
            db.SubCategory.Single(x => x.ID == subcategory.ID).Category = db.Category.Single(x => x.ID == subcategory.Category.ID);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(subcategory);
    }

这可行,但让我的眼睛流血,所以如果你有更好的建议:):

【问题讨论】:

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


    【解决方案1】:

    通常在 MVC 中,您不会像显示的那样绑定 CategoryCategory 属性。相反,您绑定到标量属性CategoryId

    public class SubCategory
    {
       public string CategoryId{get;set;}
       public virtual Category Category{get;set;}
       //other properties
    }
    

    那么在你看来

    @Html.DropDownFor(model => model.CategoryID, new SelectBox .. etc)
    

    这样,您不必向数据库发送额外的往返来获取SubCategory 对象的Category

    【讨论】:

    • 是的,好的,明天会试试这个,只是喜欢不将我的模型 1-1 映射到数据库的想法,我喜欢 OOP appoarch EF 允许的。但似乎它给我带来的问题多于好处。
    • 是的,你们都是正确的 =)。您应该绑定到 model.CategoryID。而且您不应该直接绑定到 POCO 子类别。相反,您应该创建一个视图模型对象。请参阅此处的示例stackoverflow.com/questions/6434154/mvc-code-first-style/…
    【解决方案2】:

    我通常有一个操作来处​​理我的创建和编辑保存,如下所示

    public ActionResult Save(SubCategory subcategory)
            {
    
                if (ModelState.IsValid)
                {
                    if (subcategory.id> 0)
                    {
                        SubCategory orig = db.SubCategory.Single(x => x.ID == subcategory.id);
                        if (TryUpdateModel<SubCategory>(orig))
                        {
                            db.Save();
                        }
                    }
                    else
                    {
                        db.Add(subcategory);
                        db.Save();
                    }
    
                }
    
    
                return View(subcategory);
            }
    

    我还在 SubCategory 上公开int virtual categoryID

    【讨论】:

    • 感谢您的提示,肯定会用联合保存方法替换我的编辑和创建。
    【解决方案3】:

    我认为您的问题是在您的 Edit 操作方法中,模型未绑定到数据源。

    调用UpdateModel后(有必要调用吗?)你必须调用

    db.Subcategories.Attach(subcategory);
    

    这样 EF 就会知道有修改,否则 SubCategory 对象不会附加到 db 对象,并且当您保存更改时它不会知道该实例。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多