esto puede ser justo que yo estaba muy, muy exigente, pero me gusta definir solamente una vez constantes. Si usa cualquiera de los enfoques definidos anteriormente, su constante de acción se definirá varias veces.
Para evitar esto, se puede hacer lo siguiente:
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();
}
}
A continuación, crear sus controladores, digamos por ejemplo el 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);
}
A continuación, sólo usarlo como:
// GET: Data/Cat
[ActionName(ControllerRoutes.DataController.CatAction)]
public ActionResult Etisys()
{
return View();
}
Y desde su .cshtml (o cualquier código)
<ul>
<li><a href="@ControllerRoutes.Data.Dog">Dog</a></li>
<li><a href="@ControllerRoutes.Data.Cat">Cat</a></li>
</ul>
Esto es definitivamente mucho más trabajo, pero estoy tranquilo sabiendo que la validación del tiempo de compilación está de mi parte.
Vea también: http://stackoverflow.com/q/434604 – Andrew