У меня есть представление 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, чтобы превратить это в приятное визуальное отображение.
Мой вопрос: возможно ли сжать этот список на стороне сервера?Безусловно, самая медленная часть этого представления загружает этот список клиентов.Используя PageSpeed в Chrome, он предлагает сжать 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, но она тоже не срабатываетпо результатам
$.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");
}
});
I 'Я до сих пор не уверен, почему он не сработает при успешном событии, но использование события complete и выполнение JSON.parse для responseText, похоже, добились цели.