首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC3 -在viewbag中压缩模型

MVC3 -在viewbag中压缩模型
EN

Stack Overflow用户
提问于 2011-04-08 01:23:41
回答 1查看 1.1K关注 0票数 1

我有一个MVC3视图,旨在为我们的客户运行报告。在允许您选择报告选项的视图中,我传递了一个很大的客户列表(~3K)。我把它渲染成这样:

代码语言:javascript
复制
@{Html.RenderPartial("_ClientSelector", ViewBag.Clients as IEnumerable<Client>);}

_ClientSelector部分如下所示:

代码语言:javascript
复制
<select id="clients" class="clientList" multiple="multiple">
    @foreach (Client client in Model) {
        var prefix = client.Parent == null ? "" : String.Format("{0}-({1}) / ", client.Parent.Name, client.Parent.Id);
            <option value="@client.Id">@prefix@client.Name-(@client.Id)</option>
    }
</select>

我正在使用jQuery多选库将其转换为一个很好的可视显示。

我的问题是,有没有可能压缩这个列表服务器端?到目前为止,此视图中最慢的部分是加载此客户端列表。在chrome中使用PageSpeed,它建议压缩html以使其加载更快,这是可能的吗?如果这需要放在它自己的控制器操作中,而不是放在ViewBag中,我不介意这样做。我只是想看看是否有一种方法可以加快这个页面的速度。

编辑:

我开始尝试使用下面的模板。当我手动构建json时,它可以工作。但是,当我尝试使用$.getJSON从服务器获取它时,它从不在结果上触发。使用Chrome中的调试工具,我看到返回的响应,它看起来像是有效的json。你能发现这个有什么问题吗?

代码语言:javascript
复制
public ActionResult ClientList() {
    var clients = reportRepository.GetClientList();
    IList<object> model = new List<object>();
    foreach (Phoenix.Models.Client c in clients) {
        var prefix = c.Parent == null ? "" : String.Format("{0}-({1}) / ", c.Parent.Name, c.Parent.Id);
        model.Add(new { value = c.Id.ToString(), text = String.Format("{0}{1}-({2})",prefix,c.Name,c.Id) });
    }
    return Json(model, JsonRequestBehavior.AllowGet);
}

在视图中:

代码语言:javascript
复制
<script type="text/javascript">
    $(function () {
        $.getJSON("/Report/ClientList", null, function (data) {
            $("#templateOptionItem").tmpl(data).appendTo("#clients");
        });
    });
</script>
<script id="templateOptionItem" type="test/html">
    <option value=\'{{= value}}\'>{{= text}}</option>
</script>
<select id="clients" class="clientList" multiple="multiple">
</select>

--这是使用$.ajax方法的另一次尝试,但它也不会触发结果

代码语言:javascript
复制
$.ajax({
    url: "/Report/ClientList",
    dataType: "json",
    success: function (data) {
        $("#templateOptionItem").tmpl(data).appendTo("#clients");
    }
});

这是一个有效的示例:

代码语言:javascript
复制
var Clients = [{ value: 1, text: "test123" },
               { value: 2, text: "123test" }]
$("#templateOptionItem").tmpl(Clients).appendTo("#clients");

经过多次调整,我终于得到了一些有用的东西:

代码语言:javascript
复制
$.ajax({
    url: "/Report/ClientList",
    dataType: "json",
    complete: function (data) {
       $("#templateOptionItem").tmpl(JSON.parse(data.responseText)).appendTo("#clients");
    }
});

我仍然不确定为什么它不会在成功事件上触发,但使用complete事件并在responseText上执行JSON.parse似乎已经完成了这项工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-08 01:31:51

您是否考虑过将其作为JSON数据发送到视图,并将其绑定到template in the client side或使用knockout之类的库。

您正在发送的数据的大小会增加,这很大程度上是因为您正在重复为每个3k客户端生成的相同的html。如果你不加标记地向下发送,那么大小就会小得多,然后你的列表项的代码就只能用json数据的占位符向下发送一次。

本示例基于您正在使用knockout.的想法

knockout.mapping.js :请注意,如果您正在使用knockout,此对象将使用knockout函数进行注释,或者使用JSON自动将值应用于整个对象

代码语言:javascript
复制
var JsonData = [ 
        { clientID : 'IDValye', Prefix : 'Some value for the prefix', Name = 'name value' } , 
        { ... } 
];

HTML:

代码语言:javascript
复制
<select id="clients" class="clientList" multiple="multiple" data-bind="template :{ name : 'optionTemplate', foreach : JsonData }">
</select>

<script type="text/html" id="optionTemplate">
    <option value="${ clientID }">${ Prefix }${ Name }-(${ clientID })</option>
</script>

你可以从他们网站上的教程中获得关于knockout实现的其余细节。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5585052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档