在Visual Studio的调试模式下,MVC Html.ActionLink和Url.Action缓慢呈现

时间:2013-05-23 15:46:58

标签: asp.net-mvc-4 visual-studio-2012 visual-studio-debugging

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导致我的原始代码渲染得这么慢。

1 个答案:

答案 0 :(得分:0)

使用Debug=true.禁用缓存会导致许多级别的性能问题,包括路由/操作解析,视图/部分视图位置解析和解析等。在发布模式下整体部署应用程序(Debug=false)将提高性能最多10次,尤其是对于视图中使用的大型循环。