MVC Entity Framework Edit View для модели с внешним ключом - PullRequest
0 голосов
/ 04 сентября 2011

У меня есть модель Project и модель Skill,

Проект имеет отношение один ко многим к навыкам

У меня проблема с выяснением, как выполнить метод действия action для проекта,

Когда объект проекта создается с помощью mvc, коллекция навыков равна нулю, в представлении я отображаю флажки, и мне нужно добавлять и удалять из этой коллекции

Я полагаю, мне нужно загрузить проект из базы данных, а затем отобразить измененные поля и затем сохранить, это правильный путь? Есть ли лучший способ сделать это, чем делать это вручную?

Заранее спасибо.

        [HttpPost]
    public ActionResult Edit(Project project)
    {
        if (ModelState.IsValid)
        {
            if (project.Skills == null)
            { 
                project.Skills = new List<Skill>();
            }
            foreach (var key in Request.Params.AllKeys)
            {
                if (key.Contains("Skill_"))
                {
                    if (Request.Params[key].Contains('t'))
                    {
                        var skillId = Convert.ToInt32(key.Split('_')[1]);
                        if (!project.Skills.Any(s => s.ID == skillId))
                        {
                            project.Skills.Add(db.Skills.Single(s => s.ID == skillId));
                        }
                    }
                }
            }
            List<Skill> skillsToRemove = new List<Skill>();
            foreach (var skill in project.Skills)
            {
                if (!Request.Params["Skill_" + skill.ID.ToString()].Contains('t'))
                {
                    skillsToRemove.Add(skill);
                }
            }
            foreach (var skill in skillsToRemove)
            {
                project.Skills.Remove(skill);
            }
            db.Entry(project).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        ViewBag.Skills = db.Skills.ToList();
        return View(project);
    }

Ответы [ 2 ]

1 голос
/ 05 сентября 2011

Попробуйте создать ViewModel для своего проекта и использовать его для наполнения навыками и проектами в своем представлении.

пример

public class ProjectViewModel
{
   public Project Project {get; set;}
   public List<Skills> Skills { get; set;}
}

тогда у тебя контроллер

public ActionResult Edit(int id){
   var model = new ProjectViewModel
   {
      Project = YourContext.Projects.SingleOrDefault(x=>x.ProjectId == id),
      Skills = YourContext.Skills.ToList()
   };
   return View(model);
}

[HttpPost]
public ActionResult Edit(ProjectViewModel model){
    if (ModelState.IsValid){

       //now you can use skills from the ViewModel
       foreach(Skill s in model.Skills){
          //you  should now have skill value.
0 голосов
/ 21 апреля 2016

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

 public ActionResult EditTextProperty([Bind(Include = "Id,ProductID,Name,Description,Value,CreateDate,ModifyDate,IsHaveNectar")] PVM_TextProperty TextProperty)
        {
            if (ModelState.IsValid)
            {
                db.Entry(TextProperty).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(TextProperty);
        }

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

 @Html.HiddenFor(model => model.ProductID)

Спасибо

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