Basta ya de investigar por todo internet porque estás al sitio necesario, tenemos la respuesta que buscas pero sin complicaciones.
Solución:
Supongo (corríjame si me equivoco) que desea volver a mostrar la página de edición si la edición falla y para hacer esto está utilizando una redirección.
Puede tener más suerte simplemente devolviendo la vista nuevamente en lugar de intentar redirigir al usuario, de esta manera también podrá usar ModelState para generar cualquier error.
Editar:
Actualizado en base a los comentarios. Puede colocar la URL anterior en el modelo de vista, agregarla a un campo oculto y luego usarla nuevamente 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 tampoco necesita usar esta URL de retorno, debería poder salirse con la suya:
@model ViewModel
@using (Html.BeginForm())
...
Volviendo a la publicación de la acción de su formulario en una URL incorrecta, esto se debe a que está pasando una URL como el parámetro ‘id’, por lo que el enrutamiento formatea automáticamente su URL con la ruta de retorno.
Esto no funcionará porque su formulario se publicará en una acción de controlador que no sabrá cómo guardar las ediciones. Primero debe publicar en su acción de guardar, luego manejar la redirección dentro de ella.
Para Núcleo de ASP.NET
Puedes usar asp-ruta-* attribute:
Un ejemplo:
Imagina que tienes un controlador de vehículos con acciones
Índice
Detalles
Editar
y puede editar cualquier vehículo desde el índice o desde los detalles, por lo que si hizo clic en editar desde el índice, debe volver al índice después de la edición y si hizo clic en editar desde los detalles, debe volver a los detalles después de la edición.
//In your viewmodel add the ReturnUrl Property
public class VehicleViewModel
..............
..............
public string ReturnUrl get;set;
Details.cshtml
Edit
Index.cshtml
Edit
Edit.cshtml
En su controlador:
// GET: Vehicle/Edit/5
public ActionResult Edit(int id,string previous)
var model = this.UnitOfWork.CarsRepository.GetAllByCarId(id).FirstOrDefault();
var viewModel = this.Mapper.Map(model);//if you using automapper
//or by this code if you are not use automapper
var viewModel = new VehicleViewModel();
if (!string.IsNullOrWhiteSpace(previous)
viewModel.ReturnUrl = previous;
else
viewModel.ReturnUrl = "Index";
return View(viewModel);
[HttpPost]
public IActionResult Edit(VehicleViewModel model, string previous)
if (!string.IsNullOrWhiteSpace(previous))
model.ReturnUrl = previous;
else
model.ReturnUrl = "Index";
.............
.............
return RedirectToAction(model.ReturnUrl);
Sé que esto es muy tarde, pero tal vez esto ayude a alguien más.
Uso un botón Cancelar para volver a la URL de referencia. En la Vista, intente agregar esto:
@
ViewBag.Title = "Page title";
Layout = "~/Views/Shared/_Layout.cshtml";
if (Request.UrlReferrer != null)
string returnURL = Request.UrlReferrer.ToString();
ViewBag.ReturnURL = returnURL;
Entonces puedes configurar tus botones href así:
Cancel
Aparte de eso, ¡la actualización de Jason Enochs funciona muy bien!
Recuerda algo, que tienes la capacidad de decir si te fue de ayuda.