我正在为我的MVC 3 EF模型第一个项目添加一个编辑功能,有一个列表,用户可以编辑Questions
行。
我的实体为Questions
,CoreVaue
和SubjectType,CoreValue
和SubjectType
与Question
有多对多关系。
注意:不要让CreateViewModel的名字让您感到困惑,我在创建和删除视图上使用它。 :)
这是我Controller
中的GET操作:
public ActionResult Edit(int id)
{
Question q = Arep.GetQuestionById(id);
CreateViewModel model = new CreateViewModel();
List<SubjectType> subjectypes = Arep.getallS();
List<CoreValue> corevalues = Arep.getallC();
model.SubjectTypes = new SelectList(subjectypes, "SID", "Sname");
model.CoreValues = new SelectList(corevalues, "CID", "Cname");
return View(model);
}
这是我AdminRepository
中的方法:
public Question GetQuestionById(int id)
{
return db.Question.SingleOrDefault(m => m.QID == id);
}
public void changequestion(Question question)
{
db.ObjectStateManager.ChangeObjectState(question, EntityState.Modified);
}
public List<SubjectType> getallS()
{
var Allsubjectypes = from SID in db.SubjectType
select SID;
return Allsubjectypes.ToList();
}
public List<CoreValue> getallC()
{
var AllCorevalues = from CID in db.CoreValue
select CID;
return AllCorevalues.ToList();
}
这是我在Controller
内的POST操作:
[HttpPost, ActionName("Edit")]
public ActionResult EditConfirmed(CreateViewModel model)
{
Question question = new Question();
//question.QID = id;//test
if (ModelState.IsValid)
{
Arep.changequestion(question);
Arep.save();
return RedirectToAction("Edit");
}
var CoreValueID = int.Parse(model.Cname);
var SubjectTypeID = int.Parse(model.Sname);
var getallC = Arep.getbycid(CoreValueID);
var getallS = Arep.getbysid(SubjectTypeID);
return View(model);
}
这是我的CreateViwModel:
public string QuestionText { get; set; }
public string Cname { get; set; }
public string Sname { get; set; }
public SelectList SubjectTypes { get; set; }
public SelectList CoreValues { get; set; }
这基本上是我的编辑代码,当我尝试更改值并提交时,我得到了这个错误:
Current Object State Manager contains no Object Stat Entry that references an object of type NKI3.Models.Question.
我不知道casuse这个错误是什么? :S
提前致谢!
答案 0 :(得分:1)
在EditConfirmed中,我想你想得到一个现有问题,而不是创建一个新问题。 ObjectContext不会跟踪新问题。
[HttpPost, ActionName("Edit")]
public ActionResult EditConfirmed(CreateViewModel model)
{
Question question = new Question(); // I think you want to get a existing question here
//question.QID = id;//test
if (ModelState.IsValid)
{
Arep.changequestion(question);
Arep.save();
return RedirectToAction("Edit");
}
var CoreValueID = int.Parse(model.Cname);
var SubjectTypeID = int.Parse(model.Sname);
var getallC = Arep.getbycid(CoreValueID);
var getallS = Arep.getbysid(SubjectTypeID);
return View(model);
}