web-dev-qa-db-fra.com

Comment rediriger vers une action avec des paramètres provenant d'autres actions sans passer de paramètres?

Ci-dessous, dans CreateTest, en cas de succès, je souhaite rediriger des tests à partir de CreateTest.

Je veux faire quelque chose comme ce qui suit:

    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);
        }
    }
12
learning

Vous devrez peut-être fournir les arguments lors de la redirection:

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

et l'URL vers laquelle vous allez être redirigé va maintenant ressembler à ceci: 

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

32
Darin Dimitrov

Je sais que c'est un peu vieux mais ...

Ce que j'ai fait dans le passé, c'est d'avoir une classe "MessageArea" exposée en tant que propriété sur mon contrôleur de base dont tous mes contrôleurs héritent en fin de compte. La propriété stocke en réalité l'instance de classe dans TempData. MessageArea a une méthode à Add () qui prend un message de chaîne et un type enum (par exemple, Succès, Erreur, Avertissement, Informations).

J'ai ensuite un partiel qui restitue tous les messages contenus dans MessageArea avec un style approprié en fonction du type du message.

J'ai une méthode d'extension HTMLHelper RenderMessageArea (), donc dans n'importe quelle vue, je peux simplement dire @ Html.RenderMessageArea (), la méthode et le traitement partiel prennent en charge les valeurs NULL et rien n'est affiché s'il n'y a pas de message.

Comme les données stockées dans TempData ne survivent que sur une requête, elles sont idéales pour les cas dans lesquels vous souhaitez que votre action soit redirigée, mais pour lesquelles un ou plusieurs messages sont affichés sur la page de destination, par exemple, une erreur, page non autorisée, etc ... Ou si vous ajoutez un élément, puis revenez à la page de liste d'index.

Évidemment, vous pouvez implémenter quelque chose de similaire pour transmettre d'autres données. En fin de compte, je dirais que c'est une meilleure solution à la question initiale que la réponse acceptée.

MODIFIER, EXEMPLE:

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 classe ci-dessus peut ensuite être utilisée pour ajouter des messages de votre couche d'interface utilisateur utilisée par les contrôleurs.

Ajoutez ensuite une extension HtmlHelper comme ceci:

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

Le code ci-dessus n’est pas complètement terminé. Il ya divers types de cloches et de sifflets que j’ai laissés de côté, mais vous avez l’impression.

0
Peter

Rendre la int nullable:

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