c# - 部分 View 未渲染且 Action 方法被调用两次

标签 c# jquery asp.net ajax asp.net-mvc

我试图在单击按钮时通过部分 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);
    }

我似乎正在做我看到其他人做的事情,但显然有些不对劲。

最佳答案

  1. 第一次加载页面时,您没有传递模型:

    @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/

    相关文章:

    c# - 比较两个函数的负载/性能

    c# - 尝试在 Unity 上用 C# 插入 SQLite 数据库

    jQuery DatePicker 最小最大日期

    ASP.NET + NUnit : Good unit testing strategy for HttpModule using . NET 4

    javascript - 我可以使用 JS 或 jQuery 来测试是否支持 SVG 图片吗?

    javascript - 在隐藏值上调用 jQuery .trigger ('change' ) 会破坏依赖于 knockout 的可观察对象

    .net - 找不到适合指定文化或中立文化的任何资源

    c# - 如何找出 TFS 2015 构建中的变更集是从哪里构建的?

    c# - TimeSpan.MinValue 的使用示例?为什么有人会在实践中使用它?

    c# - 扩展方法的继承