我的问题是如何从controller1中的POST方法获取自动递增的主键,并在控制器2的GET方法中将其用作外键?
目前所有的代码都是用EF生成的,我首先使用数据库。
我想我必须在controller2中编辑看起来像这样的GET方法。
// GET: /Question/Create
public ActionResult Create()
{
ViewBag.TestId = new SelectList(db.Tests, "TestId", "TestTitle");
return View();
}
这个返回一个TestTitles列表
我需要的是它在当前会话中返回最后插入的“testId”或相同的插入“testId”。它是一个整数。我该怎么做呢 ?
答案 0 :(得分:0)
创建一个具有相同名称的ActionResult,因为您没有使用模型,您只需从FormCollection
类中获取值
假设您selectlist
创建了这样的
@Html.DropDownListFor("TestId",ViewBag.TestId);
为同一视图定义另一个操作,如下所示:
[HttpPost]
public ActionResult Create(FormCollection formData)
{
formData["TestId"]
return View();
}
尽管如此,我强烈建议使用模型,并避免使用ViewBag。
答案 1 :(得分:0)
保存后,您可以从对象中获取id:
db.Foos.Add(foo);
db.SaveChanges();
var pk = foo.Id;
至于如何传递这一点,假设你正确地遵循GET-POST-Redirect模式,你需要以某种方式将它包含在重定向的URL中。具体取决于您的行动签名和路线,但通常您会执行以下操作:
return RedirectToAction("SomeAction", new { id = foo.Id });
答案 2 :(得分:0)
我没有尝试在GET方法中获取ID,而是发现我也可以在POST方法中找到它并将其用于将信息插入数据库中。使用Lambda表达式查找最后插入的ID允许我插入正确的外键值。在我改进结构之前,这可能是我的临时解决方案。
[HttpPost]
public ActionResult Create(Question question)
{
if (ModelState.IsValid)
{
question.TestId = db.Tests.OrderByDescending(t => t.TestId).FirstOrDefault().TestId;
db.Questions.Add(question);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.TestId = new SelectList(db.Tests, "TestId", "TestTitle", question.TestId);
return View(question);
}`