我有一个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; }
}
视图的呈现方式如下:
EnergySheet.cshtml:
@model EnergySheet
@using(Html.BeginForm()){
<table>
<tbody>
@Html.EditorFor(x => x.DepartmentValues)
</tbody>
</table>
<input type="submit" value="Save" />
}
DepartmentValue.cshtml:
@model DepartmentValue
<tr>
@Html.EditorFor(x => x.DayValue)
</tr>
DayValue.cshtml
@model DayValue
<td>
@Html.EditorFor(x => x.EnergyUsage)
</td>
问题
这一切都很好,并且模型在发回服务器时绑定正确。但问题是性能 - 页面需要10-15秒来渲染包含大约200个输入字段的网格。
我已经确保我在发布模式下运行,并且Web.config有<compilation debug="false">
- 所以它不应该是没有缓存视图路径的问题。我正在使用功能强大的机器 - 四核i7,16GB等
尝试修复
我尝试通过明确指定视图模板名称来替换编辑器模板上的“自动迭代” - 即@Html.EditorFor(x => x.DepartmentValues)
变为@Html.EditorFor(x => x.DepartmentValues, "DepartmentValues")
而@Html.EditorFor(x => x.DayValue)
变为@Html.EditorFor(x => x.DayValue, "DayValue")
。这也意味着手动迭代模板中的集合 - 如this post中所述。这解决了性能问题 - 页面立即呈现 - 但所有自动模型绑定都丢失了。
我的问题是 - 编辑器模板的自动渲染真的应该这么慢吗?或者我做错了什么?一个只有200个输入字段的页面肯定不应该对渲染引擎征税吗?