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 之外解决了性能问题,但现在想知道为什么调试导致我的原始代码呈现如此缓慢。