.net mvc 3创建和编辑

时间:2011-06-22 01:19:26

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

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

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

现在我通过将视图暴露给类别列表,通过ViewBag并将其绑定到下拉列表(model => model.Category.ID,new 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);
    }

正如您所看到的,我必须在上面执行quickfix以使子类别正确绑定到类别(在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);
    }

正如你所看到的,与create相同的方法,使用断点我看到subategory.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);
    }

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

通常在MVC中,您不会像您显示的那样绑定Category的{​​{1}}属性。而是绑定到标量属性SubCategory

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) 对象的Category

答案 2 :(得分:0)

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

调用UpdateModel后(是否需要调用它?),您必须调用

db.Subcategories.Attach(subcategory);

这样EF就会知道有一个修改,否则SubCategory对象没有附加到db对象,当你保存更改时,它将不知道该实例。

希望有所帮助。