Один метод контроллера MVC3 двух разных типов ActionResult? - PullRequest
1 голос
/ 24 мая 2011

В настоящее время у меня есть контроллер AssetController, в котором есть методы для навигации по дереву активов.

Я использую этот контроллер для навигации по «галерее» ресурсов, а методы контроллера в настоящее время возвращают ViewResult.

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

Я бы хотел использовать как можно больше логики моего контроллера. Я могу думать о двух вариантах здесь:

  1. Измените все методы моего контроллера, чтобы они возвращали только JsonResult, затем измените мой текущий вид, чтобы использовать json для отображения полной страницы.

    Недостатки : Это увеличивает нагрузку на логику загрузки / перенаправления на клиент. Это также делает глубокую связь проблемы, я думаю. При полном просмотре URL-адреса страниц очень «дружественны по отношению к ссылкам», так как пользователь может скопировать и вставить ссылку и передать ее кому-то, и она пойдет туда, где он ожидает. Возвращение JsonResults означает, что URL не меняется, поэтому глубокие ссылки становятся более сложными

  2. Выполните рефакторинг моего текущего контроллера, чтобы «общий» код перемещался в приватные методы контроллера. Создайте новые действия, которые возвращают JsonResult, и сохраните существующие методы, которые возвращают ViewResult.

    В настоящее время это мой выбор, так как кажется, что в контроллере хранится больше кода, что облегчает модульное тестирование. Но он также кажется слишком связанным с пользовательским интерфейсом, что происходит, когда я хочу вернуть данные в разных форматах, я просто продолжаю добавлять новые действия контроллера с различными типами ActionResult? Это так плохо?

Есть ли более разумный способ справиться с ситуацией или один из моих подходов более выгоден, чем другой?

UPDATE

Вот несколько примеров кода для пояснения:

В настоящее время у меня есть это:

public ActionResult ViewObject(PathModel inPath)
{
    using (engine)
    {
      var metaData = engine.GetFileMetaData(inPath.Path);
  return View(metaData); //This is returning a ViewResult type
    }
}

Я думаю сделать что-то подобное

private FileMetaDataModel ViewObjectInternal(PathModel inPath)
{               
  using (engine)
  {
      var metaData = engine.GetFileMetaData(inPath.Path);
      return metaData;
  }
}

public ActionResult ViewObjectAsJSON(PathModel inPath)
{
   var jsonResult = new JsonResult();
   jsonResult.Data = ViewObjectInternal(inPath).ToJson();

   return jsonResult // this is returning my data as JSON;
}

public ActionResult ViewObjectAsView(PathModel inPath)
{
  return View(engine.GetFileMetaData(inPath.Path)); //This is returning a ViewResult type
}

Ответы [ 3 ]

2 голосов
/ 24 мая 2011

Почему бы просто не вернуть ActionResult?

public ActionResult Detail()
{
    // controller logic here

    if (Request.IsAjaxRequest())
        return Json(model);

    return View(model);    
}
0 голосов
/ 24 мая 2011

Вариант № 3 может использовать сочетание обоих.Вам не нужно использовать jsonresult 100% времени.Если вы беспокоитесь о URL, вы можете использовать сочетание обоих.У вас есть основной вид, который затем динамически загружает каждый результат с помощью jQuery.Это часто лучше подходит для приложений с несколькими частями данных - поэтому создается впечатление, что приложение загружается быстрее (главное представление возвращает после связанных данных) - так что вы, несомненно, можете пойти по этому пути, понимая, что поисковые системы не будут индексироватьваши возвращенные данные.Я предполагаю, что здесь данные ваших приложений не будут проиндексированы.Если это произойдет, то jsonresult - не тот путь, по которому можно идти.

0 голосов
/ 24 мая 2011

хорошо, вы можете установить тип результата как ActionResult. Все остальные результаты наследуются от него

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