ANSWER
我采用了不同的方法。我决定初始化数据表,而不是从服务器端加载数据表,一旦我通过ajax加载tbody,然后初始化数据表。这样,我的页面正常加载,然后通过ajax加载数据,然后初始化数据表,以便它可以具有数据表的所有功能。万一它可以帮助任何人,这是我的脚本。
$(document).ready(function () {
$('#targetingtable tbody').block({
message: "<i class='fa fa-spinner fa-spin'></i> Loading Data...",
css: { border: '1px solid #aaa', padding: '10px 5px' },
overlayCSS: { backgroundColor: 'rgba(196, 196, 196, .5)' }
});
$.ajax({
url: '@Url.Action("GetDealerMediaRates", "Signup", new { cultureName = Model.CurrentCultureName })?ordersignupitemId=@Model.OrderSignupItemId&creativeTemplateId=@Model.CreativeTemplateId',
type: "POST",
dataType: "html",
success: function (data) {
var newHtml = $(data);
$('.dealermediarates').html(newHtml);
$('#targetingtable').DataTable({
'aoColumnDefs': [{
'bSortable': false,
'aTargets': ['nosort']
}],
'order': [[1, 'asc']],
'aLengthMenu': [[10, 25, 50, 100, 150, -1], [10, 25, 50, 100, 150, "All"]]
});
$('#targetingtable tbody').unblock();
}
});
$('#targetingtable').unblock();
});
更新
我现在可以将我的部分视图作为json结果。数据显示在网站上,但我现在遇到的问题是我没有看到我使用数据表的任何分页。 “加载”图标会一直亮着。这是我更新的代码。我做错了吗?
var rows = new SelectTargetingViewModel(signupService, orderSignupItem, creativeTemplateId, cultureName, false, dealermedias.OrderBy(d => d.Description).Skip(model.Start).Take(model.Length).ToList());
string html = "";
using (var sw = new StringWriter())
{
PartialViewResult partialresult = LoadGetDealerMediaPartialView(rows);
partialresult.View = ViewEngines.Engines.FindPartialView(ControllerContext, "_GetDealerMediaRate").View;
ViewContext vc = new ViewContext(ControllerContext, partialresult.View, partialresult.ViewData, partialresult.TempData, sw);
partialresult.View.Render(vc, sw);
html = sw.GetStringBuilder().ToString();
}
var result = new
{
recordsTotal = unfilteredCount,
recordsFiltered = dealermedias.Count(),
draw = model.Draw,
data = rows.DealerMedias,
resultset = html
};
return Json(result, JsonRequestBehavior.AllowGet);
}
[HttpGet]
public PartialViewResult LoadGetDealerMediaPartialView(SelectTargetingViewModel model)
{
return PartialView("_GetDealerMediaRate", model);
}
//视图
$(document).ready(function () {
$("#targetingtable").dataTable({
"processing": true,
"serverSide": true,
"iDisplayLength": 10,
"autoWidth": false,
"ajax": {
"url": '@Url.Action("GetDealerMediaRates", "Signup", new { cultureName = Model.CurrentCultureName })?ordersignupitemId=@Model.OrderSignupItemId&creativeTemplateId=@Model.CreativeTemplateId&columnheader=@Model.Description',
"type": "POST",
"dataType": "json",
success: function (result) {
$('.dealermediarates').html(result.resultset);
}
},
"aoColumnDefs": [{
'bSortable': false,
'aTargets': ['nosort']
}],
"order": [[1, 'asc']],
"aLengthMenu": [[10, 25, 50, 100, 150, -1], [10, 25, 50, 100, 150, "All"]],
"language": {
"processing": "<i class='fa fa-spinner fa-spin'></i> Loading Data ..."
}
});
});
// 以下是我最初提交的内容。
由于我的jquery数据表有一些性能问题,即使表在给定时间内显示的总记录数不超过300行,但我仍遇到性能问题。话虽如此,我试图使用服务器端加载数据。我的列是根据模型数据动态加载的,并根据模型头中的可用列,适当地加载行。此外,数据表有一些数量字段,都是复选框。我的所有表td元素现在都是部分的,所以我想知道是否有一种方法可以加载partial并将其作为json结果传递。这是我到目前为止所做的。
//控制器
var rows = new SelectTargetingViewModel(signupService, orderSignupItem, creativeTemplateId, cultureName, false, dealermedias.OrderBy(d => d.Description).Skip(model.Start).Take(model.Length).ToList());
var result = new
{
recordsTotal = unfilteredCount,
recordsFiltered = dealermedias.Count(),
draw = model.Draw,
data = rows.DealerMedias,
resultset = LoadGetDealerMediaPartialView(rows)
};
return Json(result, JsonRequestBehavior.AllowGet);
[HttpGet]
public ActionResult LoadGetDealerMediaPartialView(SelectTargetingViewModel model)
{
return PartialView("_GetDealerMediaRate", model);
}
//视图
<tbody id="editorRows" class="dealermediarates"></tbody>
//客户端
$(document).ready(function () {
$("#targetingtable").dataTable({
"processing": true,
"serverSide": true,
"iDisplayLength": 10,
"autoWidth": false,
"ajax": {
"url": '@Url.Action("GetDealerMediaRates", "Signup", new { cultureName = Model.CurrentCultureName })?ordersignupitemId=@Model.OrderSignupItemId&creativeTemplateId=@Model.CreativeTemplateId&columnheader=@Model.Description',
"type": "POST",
dataType: 'json',
success: function (data) {
$('.dealermediarates').html(data.resultset);
}
},
"language": {
"processing": "<i class='fa fa-spinner fa-spin'></i> Loading ..."
},
"aoColumnDefs": [{
'bSortable': false,
'aTargets': ['nosort']
}],
"order": [[1, 'asc']],
"aLengthMenu": [[10, 25, 50, 100, 150, -1], [10, 25, 50, 100, 150, "All"]]
});
});
这种方法有什么问题吗?目前,当我这样做时,我没有得到我的行,并且想知道这种方法是否有效,是否有任何我遗漏的东西?
答案 0 :(得分:1)
我对jQuery DataTables的经验有限,所以我无法准确回答问题的这一部分。 DataTables - 不过,是的,这是可能的。
您可以通过JsonResult
操作传回模型,然后使用jQuery操作DOM并使用从AJAX调用收到的JSON对象的值更新HTML,从而无需完全部分视图
您还可以让ActionResult
成为PartialViewResult
ActionResult
仍然有效,因为PartialViewResult
是ActionResult
的类型,但这样你就是明确你的行动可以返回的内容)并用部分视图返回的HTML替换HTML。
后者的玩具示例。
主视图
<div id="foobar">
<!-- first time load -->
@{ Html.RenderAction("FooBar", new { whateverParam = "whateverValue" }); }
</div>
部分视图(剃刀)
@model FooBarViewModel
@foreach (Bar bar in Model.Foo)
{
<div>Content goes here</div>
}
部分观点(行动)
public PartialViewResult FooBar(string whateverParam)
{
return PartialView(fooBarViewModel);
}
<强>的jQuery 强>
$.ajax({
url: "ControllerName/FooBar",
data: {
whateverParam: $("#whateverParam").val()
},
type: "GET",
success: function (fooBarHTML) {
$("#foobar").html(fooBarHTML);
},
error: function (xhr, status, errorThrown) {
//...
}
});