Я пишу приложение, которое использует ASP.NET MVC с JSON.NET в качестве сервера, отправляя JSON клиенту, который читается Knockout и затем отображается с привязками данных.Все это прекрасно работает, за исключением одной проблемы:
У меня есть класс Customer
, который используется для генерации класса ReviewAuthorViewModel
- последний предназначен специально для сериализации JSON и удаляет ненужные поля, циклические ссылкии т. д. На клиенте я хочу отобразить ссылку на страницу профиля Заказчика с URL-адресом, полученным из определенного маршрута MVC "user / {username}".Поскольку я отправляю это через JSON, у меня нет страницы .cshtml
, на которой я могу позвонить Url.Action
.
Вопрос: Для произвольного объекта, какполучить наиболее эффективно / элегантно получить URL для действия с некоторыми данными, без представления .cshtml?
Я бы предпочел решение, которое не требует дополнительного кода в каждом действии, но это может бытьЕдинственный выбор, кроме воссоздания таблиц маршрутизации на стороне клиента в JavaScript.Ниже приведены вещи, которые я уже пробовал, и то, что было неудовлетворительно для каждого из них.
Попытка решения 1
Вызовите метод UrlHelper.Action
в классе ReviewAuthorViewModel
,Тем не менее, UrlHelper
требует контекст запроса.Ради разделения интересов я не хочу, чтобы моя модель представления имела зависимость от System.Web.Routing
, и при этом я не хочу, чтобы ей требовался контекст запроса для работы.
Решение Попытка 2
Создайте класс RouteInformation
с членами Controller, Action и Data и интерфейсом IUrlViewModel
с двумя свойствами, типом get RouteInformation
и строкой get / set с именем Url
.Модели представлений, которым требуются ссылки, затем реализуют этот интерфейс, и контроллеры ищут модели представлений типа IUrlViewModel
и запускают UrlHelper.Action
с информацией из экземпляра RouteInformation
модели представления, сохраняя результат в свойстве Url.
Этот работает , но без размышлений я не знаю, как найти модели представлений, реализующие IUrlViewModel
в других моделях представлений, и это выглядит очень глупо.