我有一个 MVC3 页面,它呈现一个包含表格的视图。该表有一列对应每月的每一天,共有 7 行,每行代表一个组织的一个部门。
在表格的每个单元格中,都有一个输入文本框,用户必须在其中输入一个代表能源使用量的数值。
类模型如下所示:
public class EnergySheet
{
public DateTime Month { get; set; }
public List<DepartmentValue> DepartmentValues { get; set; }
}
public class DepartmentValue
{
public int DepartmentId { get; set; }
public string DepartmentName { get; set; }
public List<DayValue> DayValues { get; set; }
}
public class DayValue
{
public DateTime Date { get; set; }
public decimal EnergyUsage { get; set; }
}
视图呈现如下:
能量表.cshtml:
@model EnergySheet
@using(Html.BeginForm()){
<table>
<tbody>
@Html.EditorFor(x => x.DepartmentValues)
</tbody>
</table>
<input type="submit" value="Save" />
}
部门值.cshtml:
@model DepartmentValue
<tr>
@Html.EditorFor(x => x.DayValue)
</tr>
DayValue.cshtml
@model DayValue
<td>
@Html.EditorFor(x => x.EnergyUsage)
</td>
问题
这一切都很好,并且模型在发布回服务器时正确绑定。但是,问题在于性能 - 对于包含大约 200 个输入字段的网格,页面需要 10-15 秒才能呈现。
我已经确保我在发布模式下运行,并且 Web.config 已经<compilation debug="false">
- 所以它不应该是视图路径没有被缓存的问题。我正在使用足够强大的机器——quad i7、16GB 等。
尝试修复
我尝试通过显式指定视图模板名称来替换编辑器模板上的“自动迭代” - 即,@Html.EditorFor(x => x.DepartmentValues)
成为@Html.EditorFor(x => x.DepartmentValues, "DepartmentValues")
和@Html.EditorFor(x => x.DayValue)
成为@Html.EditorFor(x => x.DayValue, "DayValue")
。这也意味着手动迭代模板中的集合 - 如本文所述。这解决了性能问题 - 页面立即呈现 - 但所有自动模型绑定都丢失了。
我的问题是——编辑器模板的自动渲染真的应该这么慢吗?还是我做错了什么?一个只有 200 个输入字段的页面肯定不应该对渲染引擎征税这么多?