2010-10-25 36 views
33

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 como:ASP.NET MVC Redirigir con modelo

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

El problema es que la devolución de la vista Detalles de esta manera retiene la URL mysite/persona/Crear - idealmente me gustaría que el URL para ser mysite/persona/Detalles/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.

Respuesta

29

user460667,

directamente de 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, no podía detalles de su acción 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"); 
} 

que no podían adoptar un enfoque similar?

[editar]:

usuario, re su EDITAR. ¿No podría simplemente hacer la redirección según la convención y tener un indicador establecido (en tempdatos 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'. así la Información de la acción sería solamente nunca mostrarlo como consecuencia de la acción Crear

+3

Este es el camino a seguir.Si un mensaje simple en tempdata no es suficiente, puede simplemente arrojar todo el objeto 'PersonModel' en tempdata y recuperarlo de tempdata en su método de acción' Details'. – Charlino

6

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

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

Hola, el problema con esto es que la acción predeterminada no rellena el modelo con los mismos datos que si viniera a través de la acción 'Crear'. En cuanto a otras respuestas, la mejor solución parece ser TempData. – user460667

+1

Puede crear un método InitializeModel que haga toda la magia de asignación de datos para usted .. –

6

mente también se puede tomar el enfoque de tipo seguro de MvcContrib y hacer

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

Y si no quiere todo el poder de MvcContrib, puede usar MvcNavigationHelpers en https://github.com/uglybugger/MvcNavigationHelpers –

8

Se podría complementar lo que se ha ofrecido (uso 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); 
    } 

lo uso para los artículos que puede ser que no desea crear de nuevo en las solicitudes posteriores o persistir bastante sin embargo, en la base de datos todavía. Con esto, no necesito verificaciones nulas en mi vista, ya que la página Confirmar solo puede "obtenerse" si hay datos para ello.

+0

buen código Aún no lo he probado pero pronto tendré que trabajar en dicho componente, tengo una pregunta, ¿qué pasa si actualizo la página? ¿Funcionará o la temperatura expirará? –

Cuestiones relacionadas