Tengo un método de edición básico en mi controlador que redirige a una lista de nivel superior ("Índice") cuando la edición tiene éxito. Comportamiento estándar después del andamiaje MVC.C# ASP.NET MVC Volver a la página anterior
Estoy tratando de cambiar este método de edición para redirigir a la página anterior (no índice). Como mi método de edición no usaba el parámetro de entrada mapeado predeterminado "id", primero intenté usarlo para pasar la URL anterior.
En mi método Edit “obtener”, que utiliza esta línea para agarrar la URL anterior y funcionó bien:
ViewBag.ReturnUrl = Request.UrlReferrer;
luego envié este URL retorno al método de edición “post” mediante el uso de mi formulario etiqueta de esta manera:
@using (Html.BeginForm(new { id = ViewBag.ReturnUrl }))
Ahora aquí es donde las ruedas se cayeron. No pude analizar correctamente la URL del parámetro id.
*** ACTUALIZACIÓN: RESUELTO ** *
Usando el ejemplo de Garry como guía, he cambiado el parámetro de "id" a "ReturnURL" y se utiliza un oculto campo para pasar mi parámetro (en lugar de la etiqueta del formulario). Lección aprendida: solo use el parámetro "id" como estaba destinado a ser utilizado y manténgalo simple. Ahora funciona. Aquí está mi código actualizado con notas:
Primero, tomo la URL anterior usando Request.UrlReferrer como lo hice la primera vez.
//
// 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);
}
y ahora pasa el parámetro ReturnURL del modelo para el método [HttpPost] utilizando un campo oculto en la forma:
@using (Html.BeginForm())
{
<input type="hidden" name="returnUrl" value="@ViewBag.returnUrl" />
...
En el método [HttpPost] tiramos del parámetro de la campo oculto y redirigir a ella ....
//
// 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);
}
Incluso si no está usando 'id', no lo usaría para pasar una URL. Eso parece un truco, y estoy seguro de que hay una mejor manera de hacerlo. –
Sí, Eirc estás en lo cierto. Estaba usando un hack feo. Esta es mi primera aplicación MVC. Probé muchas cosas y leí muchas publicaciones, y el truco fue mi mejor intento. Lo arreglé basándome en el ejemplo de Gary. Gracias, –