MVC 2 - 我有一个使用大量HTML的控件。如何提高性能?

时间:2011-10-13 11:30:06

标签: html asp.net-mvc performance

我正在开发一个产品,用户到目前为止一直在使用Excel,他们希望我的MVC应用程序与此类似。 他们喜欢看年假的视觉效果,所以我开发了一个可滚动的桌子,看起来像这样; enter image description here

该表格大约有300个单元格,我可能有15个人来显示这些信息,因此您可以看到这可能会变得非常大。 在我构建控件之前,我曾向他们提到会出现性能问题。但现在他们喜欢这个产品,并希望它能更快地加载。 如果我编写的代码可以重构,我不会感到惊讶。毫无疑问,它可以写得更好,也许性能也可以提高,所以我会告诉你。 但是我怀疑真正的问题是HTML太多了。我还有什么其他选择?我还不熟悉Silverlight或HTML5,虽然如果有人可以为我提供一些很好的链接,我很乐意调查它。 我的网页上有这个标记;

<% if (Model.cvm != null && Model.cvm.Lines != null && Model.cvm.Lines.Count > 0)
   { %> 
        <table cellpadding="0" cellspacing="0">
            <tr>
                <td>
                    <table cellpadding="0" cellspacing="0" id="TeamNames"><!-- Table to display names of team members -->
                        <tr>
                            <td style="height:65px"></td>
                        </tr>
                        <% foreach (SHP.Models.CalendarViewModel.CalendarLine cl in Model.cvm.Lines)
                        {%>
                            <tr>
                                <td align="right"><%: cl.Name%></td>
                            </tr>
                        <%} %>
                    </table>
                </td>
                <td>
                    <div id="pageWidthCalendar"><!-- Table to display a scrollable grid of the annual leave calendar -->
                    <table id="ScheduledLeaveCalendar">
                        <%: Html.DisplayFor(x => x.cvm.Header1)%>
                        <%: Html.DisplayFor(x => x.cvm.Header2)%>
                        <%: Html.DisplayFor(x => x.cvm.Header3)%>
                        <%: Html.DisplayFor(x => x.cvm.Lines)%>
                    </table>
                    </div><!-- pageWidthCalendar - puts scrollbars on the calendar control -->
                </td>
            </tr>
        </table>

我的日历行显示模板具有此标记;

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SHP.Models.CalendarViewModel+CalendarLine>" %>
<%@ Import Namespace="SHP.WebUI.HtmlHelpers" %>
<%@ Import Namespace="SHP.Models" %>

<tr>
    <% foreach (var item in Model.HtmlCellCollection) { %>
            <%: Html.CalendarCellClass(item)%>
    <% } %>
</tr>

其他显示模板类似。

我的CalendarCellClass辅助方法看起来像;

    public static MvcHtmlString CalendarCellClass(this HtmlHelper helper, CalendarViewModel.CalendarCell _cell)
    {
        TagBuilder td_Outer = new TagBuilder("td");
        if (_cell.MorningOnlyFlag == true || _cell.AfternoonOnlyFlag == true)
        {
            td_Outer.InnerHtml = GetHalfDayTable(_cell);
        }
        else
            td_Outer.MergeAttribute("class", _cell.HtmlCellClass);

        return MvcHtmlString.Create(td_Outer.ToString());
    }

2 个答案:

答案 0 :(得分:2)

正如Chris Chilvers所说,具体问题是什么?数据访问?还是html一代? 如果慢速操作是控制器中的数据访问或进程,并且您的数据没有太大变化,您可以尝试使用de [OutputCache],例如,如果要在控制器中缓存操作的数据结果,则返回要显示的视图,将[OutputCache(Duration = 10)]设置为缓存10秒的结果。

示例:

Example of OutputCache

您可以在http://weblogs.asp.net/scottgu/archive/2008/07/14/asp-net-mvc-preview-4-release-part-1.aspx

的scottgu博客中阅读更多内容

答案 1 :(得分:1)

正如其他人所说,分析会很有用。

根据Internet Explorers的F12开发人员工具或Firebug,YSlow,PageSpeed或某些此类工具的请求时间图将非常有用。

另外,Timings服务器端实际创建视图会有所帮助。它也可能是在客户端呈现问题的一种情况。

请记住,在互联网应用程序中,在这方面,感知通常与“真正的性能”一样重要,AJAX-ifying可以通过加载页面的其余部分来改善他们的感知 日历本身。您可以通过仅传输JSON来加速下载和服务器端,并使用jquery在客户端上构建UI。但是,如果客户端渲染是主要问题所在,那将无济于事。