ASP.NET MVC: было бы целесообразно, чтобы действие контроллера API возвращало и View, и / или JSON - PullRequest
4 голосов
/ 04 января 2011

Я программирую API, который будет использоваться как веб-приложением, так и мобильным приложением, и я использую ASP.NET MVC 2 в своем технологическом стеке.

В настоящее время у меня есть Rest-like APIсервис, который возвращает данные в формате JSON.Это хорошо работает для мобильного приложения, но я также хочу, чтобы оно работало и для веб-приложения.

Было бы хорошим подходом для этого иметь действие контроллера, возвращающее либо HTML-представление, либо JsonResult?

Единственная разница между веб-приложением и мобильным приложением заключается в слое представления;логика приложения та же.

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

Редактировать

У меня есть еще один слой, который обрабатывает всю логику приложения, но контроллер API все еще имеет некоторую логику для проверки параметров и обработки ошибок, когда он возвращает ответ JSON.До сих пор дублирующаяся логика была бы частью проверки.

Вот некоторые фрагменты кода:

public JsonResult GetList(string accessToken, string listId)
 {
    if (string.IsNullOrEmpty(accessToken))
        return Json(new { success = false, exceptionMessage = "Facebook access token is required." });
    if (string.IsNullOrEmpty(listId))
        return Json(new { success = false, exceptionMessage = "The list id is required." });

    string facebookId = null;
    var facebookIdParseSuccess = GetFacebookId(accessToken, out facebookId);

    if (!facebookIdParseSuccess)
        return Json(new { success = false, exceptionMessage = "There was a problem accessing your Facebook profile information." });

    try
    {
        _groceryListManager.FacebookId = facebookId;
        var groceryList = _groceryListManager.GetList(listId);
        GroceryListViewModel mappedList = new GroceryListViewModel();
        Mapper.Map(groceryList, mappedList);
        return Json(new { success = true, results = mappedList });

    }
    catch (Exception ex)
    {
        return Json(new { success = false, exceptionMessage = "..."});
    }
}

Ответы [ 4 ]

2 голосов
/ 04 января 2011

Если модель вашего представления также подходит для возврата в формате JSON, выполнение обоих в одном действии может работать хорошо.Что-то вроде:

public ActionResult Foo()
{
  FooModel model = new FooModel();

  // Code here to build the model

  if (Request.IsAjaxRequest())
    return Json(model);
  else
    return View(model);
}

Это также поможет вам войти в пропасть успеха с точки зрения использования прогрессивного улучшения.Если URL-адрес для HTML и JSON один и тот же, гораздо проще использовать доступные / оптимизированные для SEO URL-адреса в разметке, а затем постепенно улучшать, добавляя ненавязчивые обработчики событий, чтобы заменить их запросами на JSON в браузерах с поддержкой JavaScript.

1 голос
/ 04 января 2011

Я видел, как один метод действия возвращал оба ранее, но, на мой взгляд, вам лучше иметь два отдельных метода действия.Вы можете сделать так, чтобы они оба вызывали другой метод с общим кодом, но, поскольку они используются для двух совершенно разных вещей, вам может оказаться проще поддерживать их, если у вас есть два метода (будущее требование может привести к изменению одногоспособ, который затрудняет поддержку как в одном методе).

Находятся ли они в одном контроллере или нет, на самом деле больше зависит от характера, размера и сложности приложения.Я отделил API как совершенно другой проект от HTML.У меня есть общие библиотеки для доступа к данным и другим общим функциям, но проекты MVC отличаются.

1 голос
/ 04 января 2011

В зависимости от того, чего именно вы хотите достичь:

0 голосов
/ 04 января 2011

но я думаю, что много логики дублироваться с контроллера API.

Я думаю, вы сами ответили на вопрос. Я бы держал их в одном контроллере. :)

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