create - C#ASP.NET MVC Volver a la página anterior
create controller asp net mvc (1)
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.
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 Editar "obtener", utilicé esta línea para captar la URL anterior y funcionó bien:
ViewBag.ReturnUrl = Request.UrlReferrer;
A continuación, envié esta URL de retorno al método Editar "publicación" utilizando mi etiqueta de formulario 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: SOLUCIONADO ** *
Usando el ejemplo de Garry como guía, cambié mi parámetro de "id" a "returnUrl" y usé un campo oculto 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 paso el parámetro returnUrl del Modelo al método [HttpPost] usando un campo oculto en el formulario:
@using (Html.BeginForm())
{
<input type="hidden" name="returnUrl" value="@ViewBag.returnUrl" />
...
En el método [HttpPost], extraemos el parámetro del campo oculto y lo redirigimos ...
//
// 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);
}
Asumo (corríjame si me equivoco) que deseas volver a mostrar la página de edición si la edición falla y para hacerlo estás usando un redireccionamiento.
Puede tener más suerte simplemente devolviendo la vista de nuevo en lugar de tratar de redirigir al usuario, de esta manera podrá usar el ModeloEstado para producir también cualquier error.
Editar:
Actualizado según los comentarios. Puede colocar la URL anterior en viewModel, agregarla a un campo oculto y luego usarla de nuevo en la acción que guarda las ediciones.
Por ejemplo:
public ActionResult Index()
{
return View();
}
[HttpGet] // This isn''t required
public ActionResult Edit(int id)
{
// load object and return in view
ViewModel viewModel = Load(id);
// get the previous url and store it with view model
viewModel.PreviousUrl = System.Web.HttpContext.Current.Request.UrlReferrer;
return View(viewModel);
}
[HttpPost]
public ActionResult Edit(ViewModel viewModel)
{
// Attempt to save the posted object if it works, return index if not return the Edit view again
bool success = Save(viewModel);
if (success)
{
return Redirect(viewModel.PreviousUrl);
}
else
{
ModelState.AddModelError("There was an error");
return View(viewModel);
}
}
El método BeginForm para su vista no necesita usar esta URL de retorno tampoco, usted debería poder salirse con la suya:
@model ViewModel
@using (Html.BeginForm())
{
...
<input type="hidden" name="PreviousUrl" value="@Model.PreviousUrl" />
}
Volviendo a su publicación de acción de formulario en una URL incorrecta, esto se debe a que está pasando una URL como el parámetro ''id'', por lo que la ruta automáticamente formatea su URL con la ruta de retorno.
Esto no funcionará porque su formulario se publicará en una acción del controlador que no sabrá cómo guardar las ediciones. Primero debe publicar su acción de guardado, luego manejar la redirección dentro de ella.