Добавьте маршрутизируемые URL-адреса ASP.NET MVC к объектам модели представления (для использования в JSON) - PullRequest
0 голосов
/ 23 февраля 2012

Я пишу приложение, которое использует 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 в других моделях представлений, и это выглядит очень глупо.

1 Ответ

0 голосов
/ 23 февраля 2012

Решение Попытка 1 является приемлемым решением. В asp.net-mvc модели представлений являются частью уровня представления, разработанного специально для использования с представлениями. Вам не нужно беспокоиться о зависимости модели представления от конкретных вещей asp.net. Фактически, они должны быть связаны, так как они должны быть спроектированы так, чтобы максимально упростить создание представления и обмен данными между веб-сервером и веб-клиентом. И это хорошее решение - создать отдельную модель представления и не использовать класс Customer напрямую для клиентов. Это не было бы нормально, если бы Customer зависело от Routing.

На самом деле, вы можете установить это свойство в контроллере -

    [HttpGet]
    public ActionResult Get()
    {
        var viewModel = new ReviewAuthorViewModel();
        viewModel.ProfilePageUrl = Url.Action("Index", "Profile");

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