В настоящее время у меня есть контроллер AssetController, в котором есть методы для навигации по дереву активов.
Я использую этот контроллер для навигации по «галерее» ресурсов, а методы контроллера в настоящее время возвращают ViewResult
.
Я начинаю создавать другой способ просмотра тех же данных, который использует ajax и не хочет, чтобы ViewResult
возвращался, а скорее JsonResult
.
Я бы хотел использовать как можно больше логики моего контроллера. Я могу думать о двух вариантах здесь:
Измените все методы моего контроллера, чтобы они возвращали только JsonResult
, затем измените мой текущий вид, чтобы использовать json для отображения полной страницы.
Недостатки : Это увеличивает нагрузку на логику загрузки / перенаправления на клиент. Это также делает глубокую связь проблемы, я думаю. При полном просмотре URL-адреса страниц очень «дружественны по отношению к ссылкам», так как пользователь может скопировать и вставить ссылку и передать ее кому-то, и она пойдет туда, где он ожидает. Возвращение JsonResults означает, что URL не меняется, поэтому глубокие ссылки становятся более сложными
Выполните рефакторинг моего текущего контроллера, чтобы «общий» код перемещался в приватные методы контроллера. Создайте новые действия, которые возвращают 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
}