У моєму контролері є основний метод редагування, який переспрямовує назад до списку верхнього рівня (“Індекс”), коли редагування вдається. Стандартна поведінка після будівельних лісів MVC.
Я намагаюся змінити цей метод редагування, щоб перенаправити назад на попередню сторінку (не в Індекс). Оскільки в моєму методі редагування не використовувався відображений вхідний параметр за замовчуванням “id”, я спочатку спробував використати його для передачі в попередній URL-адресі.
У моєму методі редагування “get” я використав цей рядок, щоб захопити попередню URL-адресу, і вона працювала нормально:
ViewBag.ReturnUrl = Request.UrlReferrer;
Потім я надіслав цю зворотну URL-адресу методу редагування “post”, використовуючи мій тег форми так:
@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);
}
id
, я б не використовував його для передачі URL-адреси. Це здається хакерством, і я впевнений, що є кращий спосіб це зробити.