У меня есть базовый метод Edit в моем контроллере, который перенаправляет обратно в список верхнего уровня («Index»), когда редактирование завершается успешно. Стандартное поведение после строительных лесов MVC.
Я пытаюсь изменить этот метод редактирования, чтобы перенаправить обратно на предыдущую страницу (не указатель). Поскольку мой метод Edit не использовал сопоставленный по умолчанию входной параметр «id», я сначала попытался использовать его для передачи предыдущего URL.
В моем методе Edit «get» я использовал эту строку, чтобы получить предыдущий URL, и он работал нормально:
ViewBag.ReturnUrl = Request.UrlReferrer;
Затем я отправил этот обратный URL-адрес в метод «Редактировать сообщение», используя мой тег формы, например:
@using (Html.BeginForm(new { id = ViewBag.ReturnUrl }))
Теперь здесь упали колеса. Я не смог получить URL, разобранный по параметру id должным образом.
*** ОБНОВЛЕНИЕ: РЕШЕНО ***
Используя пример Гарри в качестве руководства, я изменил свой параметр с «id» на «returnUrl» и использовал скрытое поле для передачи моего параметра (вместо тега формы). Извлеченный урок: используйте параметр «id» только так, как он был предназначен, и оставляйте его простым. Это работает сейчас. Вот мой обновленный код с примечаниями:
Сначала я получаю предыдущий URL с использованием Request.UrlReferrer, как и в первый раз.
//
// 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);
}