Я не знаю, как это сделать, вы ДОЛЖНЫ иметь доступ к маршрутам, по крайней мере, чтобы создать своего собственного помощника. Если ваши бизнес-объекты не знают о зарегистрированных маршрутах, вы не сможете избежать жесткого программирования.
Вот как можно ограничить жесткое кодирование URL-адресов, хотя ...
Код в URL со всеми соответствующими битами в методах вашего объекта.
class Event
{
public void SendEmail()
{
var url = string.Format("http://myurl.com/r/Event?eventId={0}", EventId);
//send emails...
}
}
Обратите внимание на /r/Event
часть URL. Это будет карта для RController
, которая будет отвечать за взятие произвольных, вымышленных ссылок и отправку 301 Permanent Redirect
и прохождение через механизм маршрутов для создания реального URL с использованием текущих маршрутов. Таким образом, вы только жестко программируете URL-адрес контроллера утилит, а не постоянно изменяющиеся действия контроллера ваших реальных страниц.
class RController : Controller
{
public ActionResult Event(int eventId)
{
Response.StatusCode = (int)HttpStatusCode.MovedPermanently;
Response.RedirectLocation = Url.Action("Details", "Event", new { eventId = eventId });
return null;
}
public ActionResult Register(int eventId)
{
Response.StatusCode = (int)HttpStatusCode.MovedPermanently;
Response.RedirectLocation = Url.Action("Register", "Event", new { eventId = eventId });
return null;
}
}
Это выглядит немного лучше, чем жестко программировать набор различных контроллеров / действий, которые вы можете переименовать позже. Думайте об этом как о своем собственном маленьком сервисе, похожем на TinyUrl.