2010-07-28 3 views
3

Je me demandais s'il était possible de filtrer quelle action est invoquée en fonction d'un paramètre dans la chaîne de requête.ASP.NET MVC - Filtrer quelle action invoquer en fonction de la chaîne de requête

Par exemple, i ont une grille avec une colonne de boutons radio pour sélectionner un élément de la grille. La grille est enveloppée dans un formulaire et en haut de la grille sont des boutons pour éditer/supprimer l'élément sélectionné. En cliquant sur les boutons edit/delete, vous retournez et vous quittez jquery magic pour définir une propriété de commande afin que je puisse distinguer entre un edit et un post. Je peux alors gérer ceci en ajoutant l'attribut de filtre HttpPost à mon action.

Maintenant, je dois ajouter une recherche au formulaire. Le plus simple pour moi est de placer le formulaire de recherche en dehors du formulaire existant et de définir la méthode à obtenir. Cela fonctionne mais j'ai un cas où le formulaire de recherche doit être situé dans ma forme de grille. Je comprends que je ne peux pas avoir de formulaires imbriqués donc j'ai enlevé les étiquettes de forme pour la forme interne, mais maintenant, en faisant une recherche, il va déclencher une demande de publication. Si vous continuez à suivre, vous verrez que cela déclenche la méthode d'action edit/delete mais je veux vraiment déclencher l'action initiale mais avoir un paramètre de recherche supplémentaire.

Voici ce que mes méthodes d'action ressemblent:

public ActionResult Index(string search) 
{ 
    return GetData(search); 
} 

[HttpPost] 
public ActionResult Index(string command, int id) 
{ 
    switch (command) 
    { 
     case "Delete": 
      DeleteData(id); 
      break; 
     case "Edit": 
      return RedirectToAction("Edit", new { id = id }); 
    } 

    return RedirectToAction("Index"); 
} 

Idéalement je voudrais pouvoir dire:

public ActionResult Index(string search) 
{ 
    return GetData(search); 
} 

[HttpPost] 
[Command(Name="Delete,Edit")] OR [Command(NameIsNot="Search")] 
public ActionResult Index(string command, int id) 
{ 
    switch (command) 
    { 
     case "Delete": 
      DeleteData(id); 
      break; 
     case "Edit": 
      return RedirectToAction("Edit", new { id = id }); 
    } 

    return RedirectToAction("Index"); 
} 

Remarquez comment i filtre qui l'action est invoquée en fonction de la commande. Peut-être que je suis dans une confusion complète ici, mais MVC est tout à fait nouveau pour moi et j'apprécierais vraiment si quelqu'un pouvait aider.

Merci

Répondre

0

Vous pouvez probablement le faire avec une contrainte de route. Par exemple, je pouvais faire quelque chose comme ceci:

public class CommandConstraint : IRouteConstraint 
{ 
    #region Fields 
    private string[] Matches; 
    #endregion 

    #region Constructor 
    /// <summary> 
    /// Initialises a new instance of <see cref="CommandConstraint" /> 
    /// </summary> 
    /// <param name="matches">The array of commands to match.</param> 
    public CommandConstraint(params string[] matches) 
    { 
     Matches = matches; 
    } 
    #endregion 

    #region Methods 
    /// <summary> 
    /// Determines if this constraint is matched. 
    /// </summary> 
    /// <param name="context">The current context.</param> 
    /// <param name="route">The route to test.</param> 
    /// <param name="name">The name of the parameter.</param> 
    /// <param name="values">The route values.</param> 
    /// <param name="direction">The route direction.</param> 
    /// <returns>True if this constraint is matched, otherwise false.</returns> 
    public bool Match(HttpContextBase context, Route route, 
     string name, RouteValueDictionary values, RouteDirection direction) 
    { 
     if (Matches == null) 
      return false; 

     string value = values[name].ToString(); 
     foreach (string match in Matches) 
     { 
      if (string.Equals(match, value, StringComparison.InvariantCultureIgnoreCase)) 
       return true; 
     } 

     return false; 
    } 
    #endregion 
} 

Et puis programmer mes itinéraires en tant que tel:

routes.MapRoute("Search", "Home/{command}", 
       new 
       { 
        controller = "Home", 
        action = "Index", 
        command = UrlParameter.Optional 
       }, 
       new { command = new CommandConstraint("Search") }); 

routes.MapRoute("Others", "Home/{command}/{id}", 
       new 
       { 
        controller = "Home", 
        action = "Index", 
        command = UrlParameter.Optional, 
        id = UrlParameter.Optional 
       }, 
       new { command = new CommandConstraint("Delete", "Edit") }); 

Évidemment, vous aurez besoin de changer vos actions Index (...) de sorte que les noms de paramètres sont à la fois «commande», mais cela devrait au moins vous aider dans la bonne direction?

+0

Bravo, cela devrait certainement me conduire dans la bonne direction. Merci encore. – nfplee

Questions connexes