tl; dr 在VS2012中以调试模式运行时,在MVC中显示包含大量记录和4条渲染链接的视图需要很长时间才能加载。
我有一个ASP.NET MVC4 Web应用程序,其中一个视图显示一个包含300条记录的表。每当我在VS2012中以调试模式运行应用程序时,加载此视图大约需要2分钟。该表有4个唯一链接,由HTML.ActionLink或URL.Action生成。通过测试,我知道这些链接的产生是违规代码。
慢代码示例:
<table>
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model) {
<tr>
<td>Bob</td>
<td>
Tony
<div style="margin-top: 5px;">
<a href="@Url.Action("Edit", "Home", new { id = item.Id })" class="btn btn-mini" title="Edit"><i class="icon-edit"></i></a>
<a href="@Url.Action("Details", "Home", new { id = item.Id })" class="btn btn-mini" title="Details"><i class="icon-file"></i></a>
<a href="@Url.Action("Delete", "Home", new { id = item.Id })" class="btn btn-mini" title="Delete"><i class="icon-trash"></i></a>
</div>
<div style="margin-top: 5px;">
@Html.ActionLink("Do Something", "SomeAction", "SomeController", new { id = item.Id }, new { @class = "btn btn-success btn-mini", data_pe_type = "auto" })
</div>
</td>
</tr>
}
</tbody>
如果我修改代码并在foreach之外构建链接的基本部分,则加载时间减少到15秒。
更快的代码示例:
<table>
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
@{
var editLink = Url.Action("Edit", "Home") + "/";
var detailsLink = Url.Action("Details", "Home") + "/";
var deleteLink = Url.Action("Delete", "Home") + "/";
var saLink = Url.Action("SomeAction", "SomeController") + "/";
}
@foreach (var item in Model) {
<tr>
<td>Bob</td>
<td>
Tony
<div style="margin-top: 5px;">
<a href="@editLink@item.Id" class="btn btn-mini" title="Edit"><i class="icon-edit"></i></a>
<a href="@detailsLink@item.Id" class="btn btn-mini" title="Details"><i class="icon-file"></i></a>
<a href="@deleteLink@item.Id" class="btn btn-mini" title="Delete"><i class="icon-trash"></i></a>
</div>
<div style="margin-top: 5px;">
<a href="@saLink@item.Id" class="btn btn-success btn-mini" data-pe-type="auto">Do Something</a>
</div>
</td>
</tr>
}
</tbody>
我正在使用IIS Express,并在Windows 7上的IE10和Chrome 27中进行了测试。在Chrome中我禁用了IPv6。这只发生在调试期间。我也有一个同事在他们的机器上测试相同的代码,他们遇到了同样的问题。
我已经通过将基本链接生成移到foreach之外来解决了性能问题,但是现在想知道为什么Debugging导致我的原始代码渲染得这么慢。
答案 0 :(得分:0)
使用Debug=true.
禁用缓存会导致许多级别的性能问题,包括路由/操作解析,视图/部分视图位置解析和解析等。在发布模式下整体部署应用程序(Debug=false
)将提高性能最多10次,尤其是对于视图中使用的大型循环。