2012-05-15 3 views
2

J'ai 2 MOyENS comme indiqué ci-Overload dans le contrôleur

public string Download(string a,string b) 
public string Download(string a) 

Mais MVC3 Avec IIS 5.1 donne exécuter erreur de temps que ce 2 mehods sont ambiguious.

comment puis-je résoudre ce problème?

+0

Avez-vous réellement * besoin * les deux méthodes? S'il vous plaît donner plus de contexte. –

Répondre

3

Étant donné que la chaîne est nullable, ces surcharges sont vraiment ambiguë du point de vue de MVC. Vérifiez simplement si b est null (peut-être en faire un paramètre facultatif, si vous souhaitez une valeur par défaut).

Vous pouvez, en revanche, essayer une implémentation personnalisée ActionMethodSelectorAttribute. Voici un exemple:

public class ParametersRequiredAttribute : ActionMethodSelectorAttribute 
    { 
     #region Overrides of ActionMethodSelectorAttribute 

     /// <summary> 
     /// Determines whether the action method selection is valid for the specified controller context. 
     /// </summary> 
     /// <returns> 
     /// true if the action method selection is valid for the specified controller context; otherwise, false. 
     /// </returns> 
     /// <param name="controllerContext">The controller context.</param><param name="methodInfo">Information about the action method.</param> 
     public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) 
     { 
      var parameters = methodInfo.GetParameters(); 

      foreach (var parameter in parameters) 
      { 
       var value = controllerContext.Controller.ValueProvider.GetValue(parameter.Name); 

       if (value == null || string.IsNullOrEmpty(value.AttemptedValue)) return false; 
      } 

      return true; 
     } 

     #endregion 
    } 

Utilisation:

[ParametersRequired] 
public string Download(string a,string b) 


// if a & b are missing or don't have values, this overload will be invoked. 
public string Download(string a) 
0

À mon avis, vous devriez essayer d'utiliser ASP.NET Routing. Ajoutez simplement un nouveau MapRoute. Vous pouvez vérifier l'exemple dans ce post