【问题标题】:ASP.NET MVC View ReRenders Part of ItselfASP.NET MVC 视图重新呈现自身的一部分
【发布时间】:2010-04-09 01:45:21
【问题描述】:

在我所有多年的 .NET 编程中,我还没有遇到过像这个一样奇怪的错误。我发现了这个问题,因为页面上的一些元素被 jQuery 双重绑定。经过一些(荒谬的)调试后,我终于发现,一旦视图完全完成了自身及其所有子视图的渲染,它就会回到任意但一致的位置并重新渲染自身。

我已经为此烦恼了两天了,我根本无法让它只渲染一次!

由于缺乏更好的调试想法,我煞费苦心地在整个 HTML 中添加了日志跟踪器,以便确定可能导致此问题的原因。例如,这段代码($log 只是登录到控制台):

...
<script type="text/javascript">var x = 0; $log('1');</script>
<div id="new-ad-form">
<script type="text/javascript">x++;$log('1.5', x);</script>
...

将产生

... <--- this happens before this snippet
1  
1.5 1 
...
10 <--- bottom of my form, after snippet
1.5 2 <--- beginning of part that runs again!
...
9 <--- this happens after this snippet

我已经搜索了我的代码库,但没有任何内容表明它应该重新渲染页面的一部分。我想知道 jQueryUI 是否与它有关,因为 #new-ad-form 是 jQueryUI 对话框的容器。

如果可能是这种情况,这是我的初始化代码:

$('#new-ad-form').dialog({

自动打开:假, 模态:真, 宽度:470, title: '制作新广告', 位置:['中心',35], 关闭:AdEditor.reset });

【问题讨论】:

  • 你能发布你的整个视图代码吗?还有任何 JS。
  • 你能发布你的视图/部分视图的相关部分吗?

标签: jquery asp.net-mvc jquery-ui


【解决方案1】:

正如我在最初的问题中所怀疑的那样,问题出在 jQueryUI 的 dialog() 方法上。页面呈现后,分配为对话框的元素会重新呈现,这意味着该元素中包含或加载的任何 Javascript 都会重新运行。就我而言,我有两个部分视图,它们有自己的 JS 文件。

我编写了最丑陋的 hack 来绕过它,但我通过创建一个全局变量并在调用 $(function()) 中的任何内容之前对其进行检查来使其工作。我写那个hack有点死,但是见鬼,现在我们可以发货了!

感谢任何试图提供帮助的人!

【讨论】:

    【解决方案2】:

    检查 JavaScript 以确保没有请求被意外地返回到同一个控制器。使用 Firebug 或 Fiddler 观察 HTTP 请求。

    【讨论】:

    • 所以在firebug中,没有请求返回给控制器,但是在页面加载之后,两个部分视图的JS文件通过GET再次请求(在已经通过在部分视图)
    • 哦,JS文件是在两个不同的地方包含两次吗?
    • 不,我已经搜索了整个项目。他们只在一个地方被引用......:\
    • 哇,好强的一个。也许开始删除东西,直到它停止。另外,尝试按照人们的建议在您的问题中发布视图代码。也许有人会注意到什么。
    • 找到了罪魁祸首,但不知道如何解决这个错误......显然 jQuery .dialog() 是有问题的代码。页面运行后,分配给对话框函数的 div 会再次自行运行。我真的很想保留对话,但这太糟糕了。
    【解决方案3】:

    我可能在这里很奇怪,但是您是否将脚本包装在 $(document).ready() 中?

    【讨论】:

    • 哈哈...当然。请参阅我对 jason rowe 回答的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多