Classe de sélecteur de méthode d'action personnalisée
Si j'étais vous, j'écrirais un sélecteur de méthode d'action et utiliser cela pour éviter les ramifications dans vos actions. J'en ai écrit un qui sépare les actions qui prennent des paramètres optionnels (évitant ainsi le code ramifié dans l'action - simplifiant les tests unitaires). La route par défaut définie par Asp.net MVC possède un paramètre optionnel id
paramètre
{controller}/{action}/{id}
id = UrlParameter.Optional
Il est donc logique de disposer de ces deux méthodes d'action :
public ActionResult Index() { ... }
public ActionResult Index(int id) { ... }
C'est ce que j'ai fait en écrivant un filtre sélecteur d'action personnalisé. Voici un article de blog détaillé qui décrit l'ensemble et fournit du code que vous pouvez consulter.
Que diriez-vous d'une solution à votre problème
Dans votre cas, cela signifie que vous devez écrire une classe de sélecteur de méthode d'action personnalisée appelée SubactionAttribute
et ensuite simplement décorer vos actions avec :
[Subaction("Details")]
public ActionResult Members(long id)
{
var member = _payment.GetMember(id);
return View("Members.Details", member);
}
[Subaction] // no name would mean default subaction (when not provided)
public ActionResult Members()
{
var members = _payment.GetMembers().ToList();
return View("Members.List", members);
}
Je ne vais pas écrire tout le cours pour vous, mais je vais seulement vous indiquer la bonne direction pour que vous puissiez suivre le même chemin pour arriver là où vous allez :
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public sealed class SubactionAttribute : ActionMethodSelectorAttribute
{
#region Properties
/// <summary>
/// Gets subaction name.
/// </summary>
public string Name { get; private set; }
#endregion
#region Constructors
/// <summary>
/// Initializes a new instance of the <see cref="SubactionAttribute"/> class.
/// </summary>
public SubactionAttribute()
: this(null)
{
// does nothing
}
/// <summary>
/// Initializes a new instance of the <see cref="SubactionAttribute"/> class.
/// </summary>
/// <param name="subactionName">Sub-action name</param>
public SubactionAttribute(string subactionName)
{
this.Name = subactionName;
}
#endregion
#region ActionMethodSelectorAttribute implementation
/// <summary>
/// Determines whether the action method selection is valid for the specified controller context.
/// </summary>
/// <param name="controllerContext">The controller context.</param>
/// <param name="methodInfo">Information about the action method.</param>
/// <returns>
/// true if the action method selection is valid for the specified controller context; otherwise, false.
/// </returns>
public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
{
if (controllerContext == null)
{
throw new ArgumentNullException("controllerContext");
}
// get the value of subaction here
string subName = /* this part you'll have to write */
// determine whether subaction matches
return this.Name == subName;
}
#endregion
}