【问题标题】:Using PagedList in partial views in MVC 4 is throwing off jQuery/JS when navigating 'paged' pages在 MVC 4 的部分视图中使用 PagedList 在导航“分页”页面时会抛出 jQuery/JS
【发布时间】:2013-04-13 23:43:39
【问题描述】:

我刚刚在我的 MVC 4 应用程序中使用 PagedList 实现了分页。我的应用程序的主页包含一个部分视图,显示有关某些对象的汇总数据列表。每个列表项旁边都有一个按钮,单击该按钮会启动一个模式窗口,显示有关该特定列表项的更多信息。

在列表项的第一个“分页”页面上一切正常,但是如果我导航到第二个“分页”页面并单击按钮启动模式,则没有任何反应。从 Chrome 中的开发人员工具中,我得到了Uncaught TypeError: Object [object Object] has no method 'modal'

有问题的部分输出列表,包含模式的 DIV 和一个用于处理启动模式窗口的按钮单击事件的 JS 函数。这是部分视图中的 JS:

<script type="text/javascript">
$(document).ready(function () {
    $('.show-modal').click(function () {
        var url = $('#modal-view-property-from-get-all').attr('data-url');
        var id = $(this).attr('data-id');

        $.get(url + '/' + id, function (data) {
            $('#view-property-from-get-all-container').html(data);
            $('#modal-view-property-from-get-all').modal('show');
        });
    });
});
</script>

当我导航回第一个“分页”页面时,按钮也不会触发,并且会抛出相同的未捕获 typeError。我使用的另一个截断多行文本的 jQuery 插件也停止工作,并且文本溢出其包含的 DIV。

  1. 这里实际发生了什么 - 为什么使用分页会像这样干扰 JS?
  2. 我该如何解决这个问题?

编辑:

特定类型的所有记录都从控制器操作返回:

return PartialView("_GetAllPropertiesPartial", model.ToPagedList(pageNumber, pageSize));

由于是局部的,分页导航由Ajax.ActionLinks()处理:

@Ajax.ActionLink("<<", "GetAllProperties", new { page = 1 }, new AjaxOptions { UpdateTargetId = "quick-property-search-results" })

【问题讨论】:

  • 当您导航到第二个页面时,是否有加载此页面的 Ajax 请求?还是在第一页渲染时加载所有内容,然后在客户端分页?
  • 是的,Ajax.ActionLink 处理导航,因为我使用的是局部视图。请参阅编辑。
  • $('.show-modal') 事件处理程序仅绑定在 document.ready 上,这意味着此后创建的任何 dom 元素(例如在第二页上创建的元素) ) 不会有那种约束力。尝试使用 .live('click', function) 而不是 .click(function)
  • 我正在使用 jQuery 1.9.1,我得到“对象没有实时方法”。它已从 1.9+ 中完全删除。我试过 .bind() 和 .on(),还是不高兴。
  • 抱歉,最新的 jQuery 版本改变了方法! .on() 应该可以工作。看看@Tieson 的回答。如果您仍然遇到问题,请尝试设置一个 jsfiddle,以便我们查看它

标签: c# jquery asp.net-mvc razor asp.net-mvc-4


【解决方案1】:

您需要将事件处理程序绑定到标记中不会被替换的内容,并使用.on() 方法而不是.click(),如下所示:

<script>
$(function () {
    $('body').on('click', '.show-modal', function (e) {
        var url = $('#modal-view-property-from-get-all').attr('data-url');
        var id = $(this).attr('data-id');

        $.get(url + '/' + id, function (data) {
            $('#view-property-from-get-all-container').html(data);
            $('#modal-view-property-from-get-all').modal('show');
        });
    });
});
</script>

如果你有一个你知道不会被替换的父元素,你可以使用 body 以外的东西。还值得注意的是,您可以使用.load()http://api.jquery.com/load/

$('#view-property-from-get-all-container').load(url + '/' + id, function (response, status, jqxhr) {
    // this is an optional callback
    $('#modal-view-property-from-get-all').modal('show');
});

【讨论】:

  • 我仍然收到 .modal 的未捕获类型错误。尽管我认为这会有所不同,因为我收到了来自另一个包含模态主体等的部分的警报。我在部分中有上述脚本,将其移动到我的 site.js 文件会有所不同?
  • @MattSull87 没有看到你的代码是如何设置的,很难说,但如果你有你的脚本,比如_Layout 或@ 987654329@“正常”视图的部分(对我来说,无论如何)。
  • 我可以提供任何其他代码来帮助您吗?
  • @MattSull87 假设您有 Firebug 或类似的东西,请尝试在您的 .get() 的回调中添加 console.log($('#modal-view-property-from-get-all'));。如果输出为“未定义”,则表示 jQuery 找不到目标元素,因此您尝试在 null 对象上调用 .modal()
  • 终于找出问题所在:我在与 GET 相关的部分视图中额外引用了 jQuery,因此当发生额外的 GET 时,即导航页面时,最初绑定到 jQuery 的内容不是t了。它总是简单的事情。我会将您的答案标记为正确 - 感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2013-09-24
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
相关资源
最近更新 更多