2011-02-24 27 views
8

A continuación, en CreateTest, sin éxito, deseo redireccionar a Tests from CreateTest.¿Cómo redirigir a una acción con parámetros de otra acción sin pasar parámetros?

quiero hacer algo como lo siguiente:

public ActionResult Tests(int ID, string projectName) 
    { 
     TestModel model = new TestModel (ID, projectName); 
     return View(model); 
    } 

[HttpPost] 
    public ActionResult CreateTest(TestModel model) 
    { 
     try 
     { 
      return RedirectToAction("Tests"); 
     } 
     catch (Exception e) 
     { 
      ModelState.AddModelError("Error", e.Message); 
      return View(model); 
     } 
    } 

Respuesta

26

puede que tenga que proporcionar los argumentos al redirigir:

return RedirectToAction("Tests", new { 
    ID = model.ID, 
    projectName = model.ProjectName 
}); 

y la URL a la que redireccionará ahora tendrá el siguiente aspecto:

/Foo/Tests?ID=123&projectName=abc

+0

Gracias, pero ¿cómo devolver los mensajes de error también? public ActionResult CreateTest (modelo TestModel) {try {return RedirectToAction ("Tests"); } catch (Exception e) {ModelState.AddModelError ("Error", e.Message); vista de retorno (Pruebas); }} – learning

+0

@ user281180, también podría pasarlos en la cadena de consulta: 'new {ID = model.ID, projectName = model.ProjectName, errorMessage =" Algún mensaje de error "}'. Pero por lo que puedo ver en caso de un error que no está redirigiendo, simplemente está representando la vista, que es la forma correcta de hacerlo, para que pueda acceder directamente al mensaje de error dentro de la vista a medida que se agrega al estado del modelo. –

+0

@Darin No funciona, tengo el mensaje de error: el elemento del modelo que se pasa al diccionario es del tipo '<> f__AnonymousType1'2 [System.Int32, System.String]', pero este diccionario requiere un modelo elemento del tipo 'MvcUI.Models.TestModel'. – learning

0

Hacer el int anulable:

public ActionResult Tests(int? ID, string projectName){ 
    //... 
} 
0

Sé que esto es un poco viejo, pero ...

Lo que he hecho en el pasado es tener una clase "MessageArea" se expone como una propiedad en mi controlador base de que toda mi controladores heredan de. La propiedad en realidad almacena la instancia de clase en TempData. MessageArea tiene un método para Agregar() que toma un mensaje de cadena y un Tipo de enumeración (por ejemplo, Éxito, Error, Advertencia, Información).

Tengo un parcial que representa los mensajes que están en MessageArea con un estilo adecuado según el tipo de mensaje.

Tengo un método de extensión HTMLHelper RenderMessageArea() así que en cualquier vista puedo decir simplemente @ Html.RenderMessageArea(), el método y el parcial se ocupan de los nulos y no se genera nada si no hay mensajes.

Dado que los datos almacenados en TempData solo sobreviven a 1 solicitud, es ideal para los casos en los que desea que su acción se redireccione pero tiene 1 o más mensajes en la página de destino, p. un error, una página no autorizada, etc. ... O si agrega un elemento pero luego regresa a la página de la lista de índice.

Obviamente, podría implementar algo similar para pasar otros datos. En última instancia, diría que esta es una mejor solución a la pregunta original que la respuesta aceptada.

EDITAR, Ejemplo:

public class MessageAreaModel { 
    public MessageAreaModel() { 
     Messages = new List<Message>(); 
    } 

    public List<Message> Messages { get; private set; } 

    public static void AddMessage(string text, MessageIcon icon, TempDatadictionary tempData) { 
     AddMessage(new Message(icon, text), tempData); 
    } 

    public static void AddMessage(Message message, TempDataDictionary tempData) { 
     var msgArea = GetAreaModelOrNew(tempData); 
     msgArea.Messages.Add(message); 
     tempData[TempDataKey] = msgArea; 
    } 

    private static MessageAreaModel GetAreaModelOrNew(TempDataDictionary tempData) { 
     return tempData[TempDataKey] as MessageAreaModel ?? new MessageAreaModel(); 
    } 

La clase anterior, entonces se puede utilizar para añadir los mensajes de la capa de interfaz de usuario utilizado por los controladores.

Luego agregar una extensión HtmlHelper así:

public static void RenderMessageArea(this HtmlHelper html) { 
    html.RenderPartial("MessageArea", 
     (MessageAreaModel)html.ViewContext.TempData[MessageAreaModel.TempDataKey] ?? MessageAreaModel.Empty); 
    html.ViewContext.TempData.Remove(MessageAreaModel.TempDataKey); 
} 

El código anterior no está completamente terminado hay varias campanas y silbatos que he dejado fuera, pero se tiene la impresión.

+0

¿Se puede publicar algún código? – Emanuele

+0

Agregué un pequeño ejemplo de código a mi respuesta a la pregunta. – Peter

Cuestiones relacionadas