C'est peut-être juste moi qui suis très, très pointilleux, mais j'aime ne définir les constantes qu'une seule fois. Si vous utilisez l'une des approches définies ci-dessus, votre constante d'action sera définie plusieurs fois.
Pour éviter cela, vous pouvez faire ce qui suit :
public class Url
{
public string LocalUrl { get; }
public Url(string localUrl)
{
LocalUrl = localUrl;
}
public override string ToString()
{
return LocalUrl;
}
}
public abstract class Controller
{
public Url RootAction => new Url(GetUrl());
protected abstract string Root { get; }
public Url BuildAction(string actionName)
{
var localUrl = GetUrl() + "/" + actionName;
return new Url(localUrl);
}
private string GetUrl()
{
if (Root == "")
{
return "";
}
return "/" + Root;
}
public override string ToString()
{
return GetUrl();
}
}
Ensuite, créez vos contrôleurs, disons par exemple le DataController :
public static readonly DataController Data = new DataController();
public class DataController : Controller
{
public const string DogAction = "dog";
public const string CatAction = "cat";
public const string TurtleAction = "turtle";
protected override string Root => "data";
public Url Dog => BuildAction(DogAction);
public Url Cat => BuildAction(CatAction);
public Url Turtle => BuildAction(TurtleAction);
}
Ensuite, il suffit de l'utiliser comme ça :
// GET: Data/Cat
[ActionName(ControllerRoutes.DataController.CatAction)]
public ActionResult Etisys()
{
return View();
}
Et depuis votre .cshtml (ou tout autre code)
<ul>
<li><a href="@ControllerRoutes.Data.Dog">Dog</a></li>
<li><a href="@ControllerRoutes.Data.Cat">Cat</a></li>
</ul>
Cela représente certainement beaucoup plus de travail, mais je suis rassuré de savoir que la validation au moment de la compilation est de mon côté.
0 votes
Voir aussi : stackoverflow.com/q/434604