我有一个项目模型和一个技能模型,
项目与技能有一对多的关系
我在解决如何为项目编辑动作方法时遇到问题,
当项目对象由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);
}
答案 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)
由于