带有外键模型的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);
}
尝试为您的项目创建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)
谢谢