【发布时间】:2012-04-04 02:27:18
【问题描述】:
我的控制器中有一个基本的 Edit 方法,当编辑成功时,它会重定向回顶级列表(“索引”)。 MVC 脚手架后的标准行为。
我正在尝试更改此编辑方法以重定向回上一页(不是索引)。由于我的 Edit 方法没有使用默认的映射输入参数“id”,因此我首先尝试使用它来传递上一个 URL。
在我的 Edit “get” 方法中,我使用这一行来获取上一个 URL,它运行良好:
ViewBag.ReturnUrl = Request.UrlReferrer;
然后,我使用我的表单标签将这个返回 URL 发送到 Edit “post” 方法,如下所示:
@using (Html.BeginForm(new { id = ViewBag.ReturnUrl }))
现在这是车轮掉下来的地方。我无法正确获取从 id 参数解析的 URL。
*** 更新:已解决 ***
以 Garry 的示例为指导,我将参数从“id”更改为“returnUrl”,并使用隐藏字段来传递参数(而不是表单标签)。经验教训:仅使用“id”参数的用途并保持简单。现在可以了。这是我更新的带有注释的代码:
首先,我像第一次一样使用 Request.UrlReferrer 获取上一个 URL。
//
// GET: /Question/Edit/5
public ActionResult Edit(int id)
{
Question question = db.Questions.Find(id);
ViewBag.DomainId = new SelectList(db.Domains, "DomainId", "Name", question.DomainId);
ViewBag.Answers = db.Questions
.AsEnumerable()
.Select(d => new SelectListItem
{
Text = d.Text,
Value = d.QuestionId.ToString(),
Selected = question.QuestionId == d.QuestionId
});
// Grab the previous URL and add it to the Model using ViewData or ViewBag
ViewBag.returnUrl = Request.UrlReferrer;
ViewBag.ExamId = db.Domains.Find(question.DomainId).ExamId;
ViewBag.IndexByQuestion = string.Format("IndexByQuestion/{0}", question.QuestionId);
return View(question);
}
我现在使用表单中的隐藏字段将模型中的 returnUrl 参数传递给 [HttpPost] 方法:
@using (Html.BeginForm())
{
<input type="hidden" name="returnUrl" value="@ViewBag.returnUrl" />
...
在 [HttpPost] 方法中,我们从隐藏字段中提取参数并重定向到它....
//
// POST: /Question/Edit/5
[HttpPost]
public ActionResult Edit(Question question, string returnUrl) // Add parameter
{
int ExamId = db.Domains.Find(question.DomainId).ExamId;
if (ModelState.IsValid)
{
db.Entry(question).State = EntityState.Modified;
db.SaveChanges();
//return RedirectToAction("Index");
return Redirect(returnUrl);
}
ViewBag.DomainId = new SelectList(db.Domains, "DomainId", "Name", question.DomainId);
return View(question);
}
【问题讨论】:
-
即使您不使用
id,我也不会使用它来传递 URL。这似乎是一个 hack,我相信有更好的方法来做到这一点。 -
是的,Eirc 你是对的。我正在使用一个丑陋的黑客。这是我的第一个 MVC 应用程序。我尝试了很多事情并阅读了很多帖子,黑客是我最好的尝试。我根据 Gary 的示例修复了它。谢谢,
标签: c# asp.net-mvc asp.net-mvc-4