Vielleicht bin ich einfach nur sehr, sehr pingelig, aber ich möchte Konstanten nur einmal definieren. Wenn Sie einen der oben beschriebenen Ansätze verwenden, wird Ihre Aktionskonstante mehrfach definiert.
Um dies zu vermeiden, können Sie Folgendes tun:
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();
}
}
Dann erstellen Sie Ihre Controller, z.B. den 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);
}
Dann verwenden Sie es einfach so:
// GET: Data/Cat
[ActionName(ControllerRoutes.DataController.CatAction)]
public ActionResult Etisys()
{
return View();
}
Und aus Ihrer .cshtml (oder einem beliebigen Code)
<ul>
<li><a href="@ControllerRoutes.Data.Dog">Dog</a></li>
<li><a href="@ControllerRoutes.Data.Cat">Cat</a></li>
</ul>
Das ist definitiv viel mehr Arbeit, aber ich bin beruhigt, weil ich weiß, dass die Kompilierzeitvalidierung auf meiner Seite ist.