MVC 4发布主键

时间:2015-02-17 21:01:44

标签: asp.net-mvc-4 post get

我的问题是如何从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”。它是一个整数。我该怎么做呢 ?

3 个答案:

答案 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);
    }`