我的控制器中有一个基本的Edit方法,当编辑成功时,它会重定向回顶级列表(“Index”)。MVC搭建后的标准行为。
我正在尝试更改此Edit方法以重定向回上一页(而不是索引)。因为我的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);
}
https://stackoverflow.com/questions/9772947
复制相似问题