我是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调用。这似乎没必要,所以我想知道
提前致谢:)
答案 0 :(得分:3)
一般来说,在控制器构造函数中进行一堆初始化是一个非常糟糕的主意。对于初学者来说,无法保证这些数据会在呼叫之间出现,因为应用程序的无状态特性可能会导致控制器在呼叫之间被破坏。这意味着要一直做好所有昂贵的工作。
你应该在Action方法中做那些昂贵的工作,使用你正在使用的缓存,在缓存超时之前不会再调用这些方法。
重新阅读时,听起来你正在谈论在页面上填充的其他数据,但是因为你正在进行Ajax调用而永远不会改变。在那种情况下,我的观点仍然存在。在页面的操作方法中执行,而不是在构造函数中执行。然后它只会在您实际检索页面时加载该数据。
答案 1 :(得分:0)
检索数据时有几种不同的思维方式。这是两个(我使用其中一个):
一:让控制器上的每个操作只检索他们需要的数据。他们都可以共享模型,并填充他们将在模型中使用的内容。此外,您可以创建私有方法来填充传入模型的特定部分,这样您就不会有多行相同的代码。 private void PopulateColors(Model ModelWithColors)
。
两个(我使用的):让模型填充自己。例如,您可能有一个颜色列表IEnumerable<string>
作为get属性,但是当模型传递给视图或由JSON(model.Colors)
序列化时,才会调用数据库。模型的初始化值(可能包括连接字符串或其他任何需要的值,也可以在模型的构造函数中或传递给工厂方法)。