MVC Routes - Как получить URL? - PullRequest
1 голос
/ 21 мая 2010

В моем текущем проекте у нас есть система уведомлений. Когда объект добавляется в другую коллекцию объектов, электронное письмо отправляется тем, кто подписан на родительский объект. Это происходит на объектном слое, а не в представлении или контроллере.

Вот проблема:

Хотя мы можем сказать, кто что создал с какой информацией в электронном письме, мы не можем вставлять ссылки на эти объекты в электронное письмо, потому что на уровне объектов нет доступа к UrlHelper. Для создания UrlHelper вам понадобится RequestContext, которого опять нет на уровне объекта.

Вопрос:

Я хочу создать вспомогательный класс для создания URL для меня. Как я могу создать объект, который будет генерировать эти URL без контекста запроса? Является ли это возможным?

Ответы [ 4 ]

2 голосов
/ 21 мая 2010

Проблема усугубляется тем фактом, что вам не нужен относительный URL-адрес в электронном письме, вам нужен абсолютный адрес электронной почты, поэтому вам также необходимо жестко задавать код домена, поскольку нет запроса на его получение.

Другим фактором является то, что электронные письма могут пережить текущую структуру сайта на месяцы или годы, поэтому вам нужна своего рода постоянная ссылка и, таким образом, способ связать несколько URL-адресов с одним действием (дополнительные маршруты). Эта последняя проблема также является фактором в SEO, когда вы не хотите оставлять ни одной страницы.

На данный момент статический метод на вашем контроллере UrlToActionX(params), расположенный рядом с методом ActionX, кажется самым простым решением. Все, что он делает, - это соответствующая строка. Format (...) для идентификаторов строго типизированных параметров для генерации постоянного URL. Добавьте статический домен спереди или домен из пользовательского объекта (поскольку вы знаете, какой домен они посещают, когда заходят на ваш сайт), и у вас есть ссылка для электронной почты.

Это не идеально, но, по крайней мере, теперь у вас есть только одно место для поддержки поколения URL.

ИМХО: Когда речь идет о постоянных ссылках на изменяющийся веб-сайт, иногда лучше полагаться на «конфигурация поверх соглашения». : -)

1 голос
/ 21 мая 2010

Я не знаю, как это сделать, вы ДОЛЖНЫ иметь доступ к маршрутам, по крайней мере, чтобы создать своего собственного помощника. Если ваши бизнес-объекты не знают о зарегистрированных маршрутах, вы не сможете избежать жесткого программирования.

Вот как можно ограничить жесткое кодирование 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.

0 голосов
/ 16 марта 2011

Вы можете использовать:

VirtualPathUtility.ToAbsolute(string.Format("~/r/Event?eventId={0}", id))

для разрешения URL. Все еще не хорошо, хотя.

0 голосов
/ 21 мая 2010

Вы можете определить интерфейс с методом, который берет любую информацию, необходимую для создания URL (идентификаторы объектов или что-то еще) и возвращает URL. Напишите реализацию этого интерфейса, которая использует UrlHelper для выполнения этой работы, а затем передайте ее на свой объектный уровень (в идеале с контейнером IoC).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...