У меня есть базовый метод Edit в моем контроллере, который перенаправляет обратно на листинг верхнего уровня ( "Индекс" ), когда редактирование завершается успешно. Стандартное поведение после строительных лесов MVC.
Я пытаюсь изменить этот метод Edit для перенаправления на предыдущую страницу (а не на индекс). Поскольку мой метод "Редактировать" не использовал введенный по умолчанию входной параметр "id" , я сначала попытался использовать это, чтобы передать предыдущий URL.
В моем методе "get get" я использовал эту строку, чтобы захватить предыдущий URL-адрес, и он работал нормально:
ViewBag.ReturnUrl = Request.UrlReferrer;
Затем я отправил этот возвращаемый URL-адрес методу "post", используя мой тег формы следующим образом:
@using (Html.BeginForm(new { id = ViewBag.ReturnUrl }))
Теперь это то, где колеса отвалились. Я не смог правильно проанализировать URL-адрес из параметра id.
*** UPDATE: SOLVED ***
Используя пример Garry в качестве руководства, я изменил свой параметр с "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 из метода Model в метод [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);
}