visual tutorial studio que net mvc microsoft framework espaƱol asp c# asp.net asp.net-mvc asp.net-mvc-2

c# - tutorial - ASP.NET MVC Redirect con modelo



mvc c# (4)

Actualmente tengo un método en mi controlador que acepta una colección de formularios, guarda los datos y luego los muestra en la página ''Detalles''. Por el momento, el código actualmente se ve algo así como:

[HttpPost] public ActionResult Create(PersonModel person)<br> { if (person.IsValid()) { person.additionalData = "Person created successfully"; return View("Details", person); } }

El problema es que devolver la vista Detalles de esta manera conserva la URL mysite / Person / Create; idealmente, me gustaría que la URL sea mysite / Person / Details / IdGoesHere.

Estoy seguro de que esto debe ser posible. Obviamente, podría usar Response.Redirect, sin embargo, esto no me permite pasar el modelo a la vista. Por lo que puedo decir, no puedo pasar el modelo usando RedirectToAction?

Gracias por la ayuda.

EDITAR: para confirmar: el modelo producido por la acción Crear es diferente al creado por la acción Detalles. Por lo tanto, hacer un redireccionamiento directo a Action y pasar el Id no funciona, ya que el modelo producido no es correcto. Para dar más contexto, el modelo de la acción Crear contiene un valor adicional que dice ''Persona creada con éxito'', si redirijo a la acción Detalles, este mensaje no está presente en el modelo.


Directamente desde mi propia aplicación:

public ActionResult Create(Booking item) { if (ModelState.IsValid) { int newID = _tasks.Create(item); // NEW section to emulate model being populated for use in Details view TempData["additionalData"] = "Person created successfully"; return RedirectToAction("Details", new { id = newID }); } else { return View(); } }

entonces, tu acción de "Detalles" no podría ser así:

public ActionResult Details(int id) { var item = _tasks.GetByKey(id); var additionalData = TempData["additionalData"]; if(item != null) { if(additonalMessage!=null) { item.additionalData = additionalData; } return View(item); } else return View("Notfound"); }

¿no podrías adoptar un enfoque similar?

¿Podría simplemente hacer la redirección según la convención y tener un indicador establecido (en tempdata como el anterior) que da este mensaje? La bandera de tempadata SÓLO se establecerá dentro de la acción Crear, por lo tanto, solo sucederá en Creación de un nuevo objeto ''persona''. por lo tanto, la acción Detalles solo lo mostrará como consecuencia de la acción Crear


Esto debería llevarlo al Modelo de detalles, pasando la identificación con él.

return RedirectToAction("Details", new { id = person.PersonID });


Puede complementar lo que se le ha ofrecido (use RedirectToAction y enrutamiento) con el uso de TempData

[HttpPost] public virtual ActionResult Create(IEnumerable<OrderItem> orderItems) { if (orderItems.Count() == 0) { return RedirectToAction("NoOrderItems"); } else { TempData["orderItems"] = orderItems; return RedirectToAction("Confirm"); } } [HttpGet] public virtual ActionResult Confirm() { var orderItems = TempData["orderItems"] as IEnumerable<OrderItem>; if (orderItems == null || orderItems.Count() == 0) { this.InvokeHttp404(ControllerContext.HttpContext); } return View(orderItems); }

Utilizo esto para elementos que quizás no desee volver a crear en solicitudes posteriores o todavía persista en la base de datos. Con esto, no necesito verificaciones nulas en mi vista, ya que la página Confirmar solo puede "obtenerse" si hay datos para ello.


Tenga en cuenta que también podría tomar el enfoque tipo seguro de MvcContrib y hacer

return this.RedirectToAction<MyController>(c => c.Details(person.PersonID));