MVC控制器调用了两次

时间:2009-07-01 12:36:25

标签: asp.net-mvc

我有一个带有Index动作的Product控制器,它基本上为ProductController创建post和Index(Post动作动词)动作的视图表单,它基本上将产品保存到db但是当发生验证错误时,我返回一个View( mymodel)其他当保存时,我正在返回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 
    }
}

4 个答案:

答案 0 :(得分:16)

有时候我发现Firebug会导致这种行为。如果已安装,请尝试禁用其Script panel

说明:在某些情况下,Firebug无法在其“脚本”面板中获取显示的脚本源。在这些情况下,它会启动第二个请求来获取它们。有关此问题的一些讨论,请参阅issue 7401,这可以解决问题,并通过Firebug 2.0.2修复。

答案 1 :(得分:13)

这是一份基本清单(从here复制而来):

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

  2. 检查您是否有任何引用空AJAX的{​​{1}}来电(浏览器会将此类空URL解释为当前页面,并会再次请求当前页面使URL动作执行几次。)

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

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

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

答案 2 :(得分:2)

此案的另一种解决方案..

我有完全相同的问题,从 Chrome 运行和测试。我无法调试它,因为第二个呼叫来自(外部呼叫)。我已经在 Firefox Internet Explorer 中对其进行了随机测试,其中没有双击。

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

希望它会帮助你们中的一些人:)

答案 3 :(得分:0)

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

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