【问题标题】:MVC Controller Called twiceMVC 控制器被调用两次
【发布时间】:2009-07-01 12:36:24
【问题描述】:

我有一个带有索引操作的产品控制器,它基本上为 ProductController 上的发布和索引(发布操作动词)操作创建视图表单,基本上将产品保存到数据库,但是当发生验证错误时,我返回一个视图( mymodel) else 保存时,我返回 RedirectToAction("Created,"Product") 但由于某些奇怪的原因,当我闯入代码时,它两次而不是一次点击产品控制器操作。因此,产品有 2 条记录一个。

public ActionResult Index()
{
    return View()
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(FormCollection fc)
{
    // 2 calls are made to this controller
    try
    {
        // save the product
        return RedirectToAction("Created"); 
    }
    catch(Exception ex)
    {
        // recreate the model from form collection
        return View(viewData); // when a validation error occurs it comes into the catch block 
    }
}

【问题讨论】:

  • 你应该修正你的命名 - 控制器!=动作。我自己还不能编辑你的帖子。 ://
  • 如果它们相差 1 个可空参数,则不需要 2 个索引操作。
  • 不要传递 FormCollection,而是尝试绑定:“public ActionResult Save(Product product){...}”。
  • 您需要发布发布到该控制器操作(保存)的 html 表单。这可能会告诉我们为什么它会被发布两次。
  • 您仍然需要向我们展示发布到该索引操作的 HTML 表单。那里可能有一个错误,导致它发布了两次。

标签: asp.net-mvc


【解决方案1】:

有时我发现 Firebug 会导致这种行为。如果您安装了它,请尝试禁用它的Script panel

说明:在某些情况下,Firebug 无法在其脚本面板中获取用于显示的脚本源。在这些情况下,它会发起第二个请求来获取它们。请参阅issue 7401 了解有关此问题的一些讨论,这可以缓解问题并在 Firebug 2.0.2 中得到修复。

【讨论】:

  • 这是一个严重的问题:(另外,如果 YSlow 明显设置为自动运行,请注意 YSlow 也会这样做!
  • 天啊。我花了大约半个小时试图弄清楚这一点。然后我决定搜索stackoverflow。谢谢!
  • 谢谢,没想到禁用萤火虫。
  • 如果你想保持 firebug 的启用,你可以尝试在调试模式下返回一个视图而不是重定向:#if (DEBUG) return View("NewAction"); #else return RedirectToAction("NewAction", new { id= viewModel.ID }); #endif
  • 刚刚注意到 Chrome 18.0.1025.168 也能做到这一点......无论是否打开开发者工具
【解决方案2】:

这是一个基本清单(复制自here):

  1. 检查视图中没有任何图像或其他元素 空src 属性(例如<img src=”" />)或有src 属性引用不再存在的东西。你最好 直接在浏览器的“页面源”中查看,而不是在视图本身中查看 渲染视图时可能出现一些“动态”问题。一旦您 在页面的HTML 源中找到这样的空元素,这通常是微不足道的 在您的视图中找到相同的元素并解决问题。 <link href=""> 也可能发生这种情况。

  2. 检查您没有任何引用空 URLAJAX 调用(浏览器会将此类空 URL 解释为当前页面,并将再次请求当前页面以执行 Controller 操作执行几次)。

  3. 您忘记从发出AJAX 调用的链接或按钮的JavaScript 单击事件处理程序返回“false”。如果忘记“return false”,浏览器只会解释链接的默认操作——常规,非AJAX,再次调用同一页面)

  4. 有时 Firebug 和 YSlow [ Firefox (FF) 插件 ] 可能会导致此类问题。只需在 FF 中暂时禁用它们或使用其他浏览器进行测试。

  5. 注意装饰您的控制器或动作的重复过滤器。 (这是我的问题)

【讨论】:

  • 我已经看到了这种行为。我有一个网格,其 img src 属性设置为 # 并且控制器正在获取每个图像。同样,这件事只发生在FF。多么糟糕的浏览器。我又遇到了这个问题。挠头在 1200 行中找到那行...
  • 谢谢Leniel Macaferi,我花了很多时间才明白我的情况是
  • 从我的布局页面中删除 后它起作用了。
  • 对我来说是#1。在 HTML <video> 标签下,我有两个不同来源的 <source src="#">。控制器正在加载 3 次。一旦我删除了这两个src="#" 标签,控制器只正确加载了一次。
  • 对我来说,问题是 src="#" 的 imgs,删除此属性解决了问题。
【解决方案3】:

这种情况的另一种解决方案..

我在 Chrome 中运行和测试时遇到了完全相同的问题。我无法调试它,因为第二个呼叫来自(外部呼叫)。我在 FirefoxInternet Explorer 中随机测试了它,没有出现双击。

无论是什么讨厌的事情,我已经删除了 Chrome 缓存(一切!!!)并且问题已经解决了。

希望对你们中的一些人有所帮助:)

【讨论】:

    【解决方案4】:

    我在生成图像的控制器操作中遇到了类似的问题,我只在 Firefox 中看到它。有一个非常古老的错误导致了这个问题,我猜它仍然存在。

    https://bugzilla.mozilla.org/show_bug.cgi?id=304574

    【讨论】:

      猜你喜欢
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 2015-08-14
      相关资源
      最近更新 更多