从MVC3控制器动作中检索json的更好方法是什么?

时间:2011-09-11 23:24:05

标签: json asp.net-mvc-3

我是MVC3的新手,我开始研究一个新的jQuery / MVC3 / EF 4.1代码第一个项目,并且已经讨论了一些现有的代码。当某个下拉列表的值发生更改时(SubtypeID.change事件),代码的一部分通过Controller操作从db检索值。这是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);
    }

这很好用,但是在我们的Controller构造函数中,我们有很多代码从db中检索不同的值来填充其他下拉列表和网格等。一旦页面加载,我们第一次不需要获取这些因为它们已经在页面中,所以再次返回值,但每次触发.change事件并调用StudyDesign / GetSubtypes时,Controller构造函数都会运行并再次执行所有db调用。这似乎没必要,所以我想知道

  • 有更好的方法吗?
  • 可以/我们应该以不同的方式检索json数据吗?
  • 我们应该在单独的Controller中使用json Actions / methods吗?

提前致谢:)

2 个答案:

答案 0 :(得分:3)

一般来说,在控制器构造函数中进行一堆初始化是一个非常糟糕的主意。对于初学者来说,无法保证这些数据会在呼叫之间出现,因为应用程序的无状态特性可能会导致控制器在呼叫之间被破坏。这意味着要一直做好所有昂贵的工作。

你应该在Action方法中做那些昂贵的工作,使用你正在使用的缓存,在缓存超时之前不会再调用这些方法。

重新阅读时,听起来你正在谈论在页面上填充的其他数据,但是因为你正在进行Ajax调用而永远不会改变。在那种情况下,我的观点仍然存在。在页面的操作方法中执行,而不是在构造函数中执行。然后它只会在您实际检索页面时加载该数据。

答案 1 :(得分:0)

检索数据时有几种不同的思维方式。这是两个(我使用其中一个):

一:让控制器上的每个操作只检索他们需要的数据。他们都可以共享模型,并填充他们将在模型中使用的内容。此外,您可以创建私有方法来填充传入模型的特定部分,这样您就不会有多行相同的代码。 private void PopulateColors(Model ModelWithColors)

两个(我使用的):让模型填充自己。例如,您可能有一个颜色列表IEnumerable<string>作为get属性,但是当模型传递给视图或由JSON(model.Colors)序列化时,才会调用数据库。模型的初始化值(可能包括连接字符串或其他任何需要的值,也可以在模型的构造函数中或传递给工厂方法)。