MVC3 -压缩模型在viewbag
本文关键字:viewbag 模型 压缩 MVC3 | 更新日期: 2023-09-27 17:49:01
我有一个MVC3视图,旨在为我们的客户运行报告。在允许您选择报告选项的视图中,我传递了一个大的客户端列表(约3K)。我把它渲染成这样:
@{Html.RenderPartial("_ClientSelector", ViewBag.Clients as IEnumerable<Client>);}
_ClientSelector部分是这样的:
<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中使用pagesspeed,它建议压缩html以使其加载更快,这是可能的吗?如果这需要在它自己的控制器动作中而不是放在ViewBag中,我不介意那样做。我只是想看看是否有一种方法可以加快这个页面的速度。
编辑:我开始摆弄你下面的模板。当我手动构建json时,它可以工作。然而,当我试图从服务器使用$。getJSON,它永远不会对结果触发。在Chrome中使用调试工具,我看到响应回来,它看起来像有效的json。你能发现这个有什么问题吗?
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);
}
在视图中:
<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({
url: "/Report/ClientList",
dataType: "json",
success: function (data) {
$("#templateOptionItem").tmpl(data).appendTo("#clients");
}
});
下面是有效的示例:
var Clients = [{ value: 1, text: "test123" },
{ value: 2, text: "123test" }]
$("#templateOptionItem").tmpl(Clients).appendTo("#clients");
经过多次调整,我终于找到了一些工作:
$.ajax({
url: "/Report/ClientList",
dataType: "json",
complete: function (data) {
$("#templateOptionItem").tmpl(JSON.parse(data.responseText)).appendTo("#clients");
}
});
我仍然不确定为什么它不会在成功事件上触发,而是使用完整的事件并做一个JSON。对responseText的解析似乎已经完成了这个技巧。
您是否考虑过将其作为JSON数据发送到视图,并将其绑定到客户端的模板或使用knockout之类的库?
你发送的数据的大小很大程度上增加了,因为你正在重复相同的html,你正在为每3000个客户端生成。如果你发送下来没有标记的大小将会小得多,然后你的列表项目的代码可以只发送一次与json数据的占位符。
EDIT: 这个例子是基于你正在使用knockout的想法。 JSON:请注意,如果您正在使用knockout,则该对象将被注释为ko。可观察函数,或者使用knockout.mapping.js可以用来在整个对象中自动应用这些值 您可以从他们网站上的教程中获得关于knockout实现的其余详细信息。
HTML: var JsonData = [
{ clientID : 'IDValye', Prefix : 'Some value for the prefix', Name = 'name value' } ,
{ ... }
];
<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>