Лучший способ получить JSON из действия контроллера MVC3? - PullRequest
1 голос
/ 12 сентября 2011

Я довольно новичок в MVC3, и я начал работу над новым проектом с кодом jQuery / MVC3 / EF 4.1 и сначала изучал существующий код.Одна часть кода извлекает значения из БД через действие Controller, когда когда-либо изменяется значение определенного раскрывающегося списка (событие SubtypeID.change).Вот jQuery:

    $.getJSON(
    "/StudyDesign/GetSubtypes?typeId=" + typeId,
    function (data) {
        var theDropDown = document.getElementById("SubtypeID");

        if (data.length === 0) {
            theDropDown.disabled = true;
        }

        $.each(data, function () {
            $("#SubtypeID").append($('<option>').attr('value', this.SubtypeID).text(this.Name));
        });
    }
);

А вот действие контроллера:

    [OutputCache(Duration = int.MaxValue, VaryByParam = "typeId", Location = OutputCacheLocation.Server)]
    public JsonResult GetSubtypes(int typeId)
    {
        var studyType = this._studyDesignRepository.StudyTypes.SingleOrDefault(s => s.StudyTypeID == typeId);
        return studyType == null ? this.Json(new List<Subtype>()) : this.Json(studyType.Subtypes.Select(s => new { s.SubtypeID, s.Name }).ToList(), JsonRequestBehavior.AllowGet);
    }

Это прекрасно работает, но в нашем конструкторе контроллера у нас есть много кода, который получает различные значения из БДкоторые заполняют другие выпадающие списки и сетки и т. д. После первой загрузки страницы нам не нужно снова получать эти значения, поскольку они уже находятся на странице, но каждый раз, когда вызывается событие .change и вызывается StudyDesign / GetSubtypes, конструктор контроллера запускается и снова выполняет все вызовы базы данных.Это кажется ненужным, поэтому мне интересно,

  • Есть ли лучший способ сделать это?
  • можем / должны ли мы получить данные json другим способом?
  • Должны ли мы иметь действия / методы json в отдельном контроллере?

Заранее спасибо:)

Ответы [ 2 ]

3 голосов
/ 12 сентября 2011

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

Вы должны выполнять эту дорогостоящую работу в своем методе Action, поскольку при использовании кеширования эти методы не будут вызываться снова, пока время кеширования не будетout.

После перечитывания звучит так, будто вы говорите о других данных, которые заполняются на странице, но никогда не меняются, потому что вы делаете вызовы Ajax.В этом случае моя точка зрения остается в силе.Сделайте это в вашем методе действия для страницы, а не в конструкторе.тогда эти данные будут загружены только при фактическом извлечении страницы.

0 голосов
/ 12 сентября 2011

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

Один: каждое действие на контроллере должно извлекать только те данные, которые ему нужны.Все они могут поделиться моделью и указать, что они будут использовать в модели.Кроме того, вы можете создавать частные методы для заполнения определенных частей передаваемой модели, чтобы у вас не было нескольких строк одного и того же кода.private void PopulateColors(Model ModelWithColors).

Два (что я использую): пусть модели заполняют себя.Например, у вас может быть список цветов как IEnumerable<string> в качестве свойства get, но когда модель передается в представление или сериализуется только с помощью JSON(model.Colors), выполняется вызов базы данных.Значения инициализации для моделей (которые могут включать строку подключения или что-либо еще необходимое, также могут быть в конструкторе модели или передаваться в метод Factory).

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