này có thể chỉ cho tôi là thực sự, thực sự kén chọn, nhưng tôi muốn chỉ định nghĩa các hằng số một lần. Nếu bạn sử dụng bất kỳ phương pháp nào được xác định ở trên, thì hằng số hành động của bạn sẽ được xác định nhiều lần.
Để tránh điều này, bạn có thể làm như sau:
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();
}
}
Sau đó tạo các bộ điều khiển của bạn, nói ví dụ như 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);
}
Sau đó, chỉ cần sử dụng nó như:
// GET: Data/Cat
[ActionName(ControllerRoutes.DataController.CatAction)]
public ActionResult Etisys()
{
return View();
}
Và từ .cshtml của bạn (hoặc bất kỳ mã nào)
<ul>
<li><a href="@ControllerRoutes.Data.Dog">Dog</a></li>
<li><a href="@ControllerRoutes.Data.Cat">Cat</a></li>
</ul>
Điều này chắc chắn là nhiều công việc hơn, nhưng tôi rất dễ hiểu khi xác nhận thời gian biên dịch ở bên cạnh tôi.
Nguồn
2017-01-28 05:56:04
Xem thêm: http://stackoverflow.com/q/434604 – Andrew