.net MVC 3 создавать и редактировать - PullRequest
0 голосов
/ 22 июня 2011

Я боролся с созданием и редактированием модели, которая содержит другую модель как часть ее модели.

Подкатегория содержит категорию в качестве переменной, поскольку она должна иметь возможность ссылаться на нее.

Теперь я решил часть создания, открыв представление списку категорий через 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);
    }

Как вы можете видеть, мне нужно было выполнить приведенное выше быстрое исправление, чтобы подкатегория правильно связывалась с категорией (в подкатегории БД в виде столбца с 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);
    }

Как видите, тот же метод, что и при создании. Используя точку останова, я вижу, что подкатегория.Категория заполнена правильно, но по какой-то причине она не сохраняети после перезагрузки страницы ссылка на 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 ]

1 голос
/ 22 июня 2011

У меня обычно есть одно действие, чтобы управлять обоими созданиями и изменениями сохранения, как показано ниже

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);
        }

Я также выставляю int virtual categoryID в подкатегории

1 голос
/ 22 июня 2011

Обычно в MVC вы не привязываете свойство Category вашего 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 объекта SubCategory.

0 голосов
/ 22 июня 2011

Я думаю, что ваша проблема в том, что в вашем методе действия Edit модель не привязана к источнику данных.

После вызова UpdateModel (необходимо ли его вызывать?) Необходимо вызвать

db.Subcategories.Attach(subcategory);

Таким образом, EF будет знать, что есть изменение, иначе объект SubCategory не будет прикреплен к объекту db, и когда вы сохраните изменения, он не будет знать этот экземпляр.

Надеюсь, чтопомогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...