我试图在单击按钮时通过部分 View 和 ajax 填充和渲染网络网格。我有两个问题。 1. 部分网格似乎从未在屏幕上填充和渲染,尽管我在部分 View 中有一个断点并且我看到它被击中。 2. Action 方法被调用两次,但第二次出错。我想知道这是否是造成这种情况的原因。
主视图:
$(function () {
$("#btnGetOpsLog").click(function () {
var numberOfRecords = $("#ddlNumberOfRecords").val();
$.ajax({
type: "POST",
url: '@Url.Action("NumberOfRecordsChanged")',
data: { numberOfRecords: numberOfRecords }
}).success(function (result) {
$('#Grid').html(result);
}).error(function (xhr, status) {
alert(xhr.responseText);
});
});
});
<div class="row">
@Html.DropDownList("ddlNumberOfRecords", Model.NumberOfRecordsSelectList, "Select", new { id = "ddlNumberOfRecords" })
<input type="button" id="btnGetOpsLog" value="Get Logs" />
</div>
<br />
<br />
<div id="Grid">
@Html.Partial("_OperationLogs")
</div>
这是我的部分观点
@model Assurant.Integration.ServiceRegistry.ServiceRegistryWebUI.Models.OperationLogViewModel
@{
if (Model != null && Model.Logs != null && Model.Logs.Any())
{
var grid = new WebGrid(null, defaultSort: "Name", rowsPerPage: Model.NumberOfRecords);
grid.Bind(Model.Logs, rowCount: Model.Logs.Count, autoSortAndPage: false);
grid.Pager(WebGridPagerModes.All);
grid.GetHtml(tableStyle: "display",
alternatingRowStyle: "alt");
}
}
最后,我的操作方法:
public ActionResult NumberOfRecordsChanged(int? numberOfRecords)
{
if (numberOfRecords.HasValue)
{
var model = new OperationLogViewModel
{
Logs =
_serviceManager.GetOperationLogs(numberOfRecords.Value, 0,
new Guid("45726746-f62d-41cb-bdba-bc4c6ab6cc43"),
new Guid("ef8c3e19-179e-4303-afbb-21613c148b50")).ToList(),
NumberOfRecordsSelectList = new SelectList(new List<int> { 25, 50, 75, 100 }),
NumberOfRecords = numberOfRecords.Value
};
return PartialView("_OperationLogs", model);
}
return Json(new { ok = false, message = "Broken" }, JsonRequestBehavior.AllowGet);
}
我似乎正在做我看到其他人做的事情,但显然有些不对劲。
最佳答案
第一次加载页面时,您没有传递模型:
@Html.Partial("_OperationLogs")
因此,这会被部分中的语句 if (Model != null ..
) 忽略。
将其更改为:
@Html.Partial("_OperationLogs", Model)
- 它会被调用两次,因为您没有阻止按钮默认设置,并且您的表单再次提交,而
numberOfRecords
没有值。
使用 preventDefault
修复此问题:
$("#btnGetOpsLog").click(function (e) {
e.preventDefault();
更新
根据注释,grid.GetHtml
在表达式中求值,前面没有 @
。
关于c# - 部分 View 未渲染且 Action 方法被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31188507/