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

本文关键字:实体 框架 编辑 视图 MVC 模型 | 更新日期: 2023-09-27 18:07:49

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

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

我有一个问题,弄清楚如何做项目的编辑动作方法,

当项目对象由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);
    }

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

尝试为您的项目创建ViewModel,并使用它来填充您的视图上的技能和项目。

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

then in your controller

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.

我也有同样的问题,我想这样我的外键产品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)

谢谢