0

J'ai deux méthodes d'action qui s'appellent en utilisant le même nom d'action, cependant, en fonction du type de paramètre réel, dépend de la méthode qui doit être appelée. Cela provoque une ambiguïté. J'ai créé un attribut qui détermine si le paramètre est un Guid et est la méthode appropriée.Bonne utilisation de l'attribut pour déterminer la méthode correcte à appeler

[RequiredGuidParameter(ParameterName = "title")] 
[ActionName("Title")] 
public ActionResult Item_ById(Guid id) 
{ ... } 

[ActionName("Title")] 
public ActionResult Item_ByName(string id) 
{ ... } 

L'attribut ressemble à ceci:

public string ParameterName = string.Empty; 

    public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo) 
    { 
     object parameter = null; 
     try 
     { 
      parameter = controllerContext.RouteData.GetRequiredString(ParameterName) as object; 
      if (parameter != null) 
      { 
       Guid guid; 
       return Guid.TryParse((string)parameter, out guid); 
      } 
     } 
     catch { } 

     parameter = controllerContext.RequestContext.HttpContext.Request[ParameterName] as object; 
     if (parameter != null) 
     { 
       Guid guid; 
       return Guid.TryParse((string)parameter, out guid); 
     } 

     return false; 
    } 

Le but ultime étant que si le paramètre est un Guid exécuter cette méthode, se déplacer autrement sur, dans ce cas, elle trouve la suivante. Y a-t-il un meilleur moyen qui n'invite pas à créer une route supplémentaire? Ou peut-être un meilleur moyen tout autour?

Répondre

0

Pourquoi ne pas quelque chose comme:

public ActionResult Item_Search(string id, Guid guid) 
{ 
    if(string.IsNullOrWhiteSpace(id) 
     SearchById(); 
    if(guid != new Guid()) 
     SearchByGuid() 
} 

non warranty'd Code psuedo/\

+0

je alors avoir des routes qui devraient ou que querystring. Le lien qui pointe vers cette actionmethod est soit un titre (chaîne) ou un id (guid). Je pourrais vérifier si la chaîne est un guide et faire une déclaration si/alors, mais j'espérais séparer les préoccupations avant cela. –

+0

@Tony Basallo - Vous pouvez rendre ces paramètres de route optionnels donc? Id = asd ou? Guid = longguidstring toujours travaillé. – jfar

+0

Ceci est une option, donc nous l'appellerons une réponse. –