MVC实体框架编辑具有外键的模型的视图

时间:2011-09-04 16:36:58

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

我有一个项目模型和一个技能模型,

项目与技能有一对多的关系

我在解决如何为项目编辑动作方法时遇到问题,

当项目对象由mvc实例化时,技能集合为空,在视图中显示复选框,需要在此集合中添加和删除

我想我需要从数据库加载Project然后映射修改后的字段然后保存,这是正确的方法吗?有没有比手动更好的方法呢?

提前致谢。

        [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 个答案:

答案 0 :(得分:1)

尝试为您的项目创建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.

答案 1 :(得分:0)

我有同样的问题,我想是这样的 我的外键产品ID,你需要把它放在绑定包含列表中 控制器;

 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)

由于