【问题标题】:Why does my function stop working without an alert?为什么我的功能在没有警报的情况下停止工作?
【发布时间】:2020-02-12 06:43:18
【问题描述】:

所以我认为这里有这个功能:

function izbrisi() {
        var b = document.getElementById('proizvod').value;
        {
            $.ajax({
                url: '@Url.Action("IzbrisiProizvod", "Proizvod")',
                data: { id: b }
            }).done(function () {
                alert('Izbrisan');
                });
            alert('Izbrisan');  @* bez ovoga se ne brise proizvod *@
        }
    }

它传递给的控制器:

public ActionResult izbrisiProizvod(int Id)
        {
            RadniProizvod.IzbrisiProizvod(Id);
            return View();
        }

最后是“IzbrisiProizvod”方法:

public void IzbrisiProizvod(int IdProizvoda)
        {
            Proizvod izbrisaniProizvod = azilEntities.Proizvods.FirstOrDefault(x => x.idProizvoda == IdProizvoda);
            azilEntities.Proizvods.Remove(izbrisaniProizvod);
            azilEntities.SaveChanges();
        }

无论出于何种原因,如果我不添加最终警报(有注释的警报),代码将无法正常工作。没有任何内容被删除,没有任何内容被报告给控制台。一旦我添加了最终警报,它就会神奇地开始工作。

谁能给我解释一下这个魔法?

【问题讨论】:

  • 也许您还应该添加.fail,以防您的请求失败。
  • 调试时是否触发izbrisiProizvod(int Id)?!
  • 没有“警报”,控制器和方法都不会被触发。有了警报,他们就是。

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


【解决方案1】:

根据文档,始终像这样编写您的 jquery 函数。 (always 是可选的)

// Assign handlers immediately after making the request,
// and remember the jqXHR object for this request
var jqxhr = $.ajax( "example.php" )
  .done(function() {
    alert( "success" );
  })
  .fail(function(jqXHR, textStatus, errorThrown) {
    alert( "error" );
  })
  .always(function() {
    alert( "complete" );
  });

所以在你的情况下:

function izbrisi() {
        var b = document.getElementById('proizvod').value;
        {
            $.ajax({
                url: '@Url.Action("IzbrisiProizvod", "Proizvod")',
                data: { id: b }
            }).done(function () {
                alert('Izbrisan');
            }).fail(function() {
                   alert( "error" );
            }).always(function() {
                   alert( "complete" );
           });
        }
    }

并且可能将警报更改为控制台日志或类似内容。

【讨论】:

  • 好的,这真的很奇怪。您编写的代码无法按原样工作。但是,在我向其最后一行添加警报后,它就可以工作了。更没有意义的是它会触发 FAIL 和 ALWAYS,但不会触发 DONE,尽管它随后会起作用。同样,没有警报,它仍然没有。
  • 我稍微更改了代码以捕获错误。警告错误以找出失败原因。顺便说一句,你为什么要在 ajax 调用中返回一个视图?
  • 我实际上并不需要视图,只是为了处理数据,所以我将其更改为返回新的空结果,看看是否是这样。它没有改变任何东西。我现在确实注意到控制台中抛出了一个错误:NS_ERROR_XPC_SECURITY_MANAGER_VETO:
【解决方案2】:

在您的浏览器开发工具中试用网络工具。例如Firefox Dev Tools。当您单击您的元素(比如说按钮)时,您应该在网络工具中的所有请求列表中看到新的 http 请求。如果你不这样做,那么你的 ajax 调用根本没有发生,或者它发生在上一页,因为你经历了页面重新加载。检查 Proizvod 是否真的被删除了。如果是,那么您的 js 函数可以工作,但您看不到响应。如果 Network 工具中有新的 http 请求,请稍微检查一下,看看发生了什么(只需单击它,在右侧您将看到详细信息)。

此外,您可以打开控制台,然后单击控制台中的 html 元素类型:izbrisi()。函数应该执行,如果它有效,您将在网络工具中看到一个新的 http 请求,并且您的 done 警报将弹出。如果是这种情况,那么您的 html 元素在单击事件上具有默认行为。所以你应该阻止它以防止页面重新加载。假设您使用一个按钮单击它。按钮 html 应如下所示:

<button onclick="izbrisi(e)">Izbrisi</button>

还有js函数:

function izbrisi(e) {
   e.preventDefault();
   // ... your code goes here
}

【讨论】:

    【解决方案3】:

    无论出于何种原因,如果我不添加最终警报(有注释的警报),代码将无法正常工作。没有任何内容被删除,没有任何内容被报告给控制台。一旦我添加了最终警报,它就会神奇地开始工作。

    您的 ajax 仅包含 .done() 承诺回调。这只会在 ajax 请求收到 200 成功代码时执行。您可以在 .fail() 承诺中添加一个独特的警报,以查看正在发生的事情。

    在您的代码中,无论如何都会触发最终警报。

    试试这个以帮助了解发生了什么。使用这个fiddle 并打开你的控制台。请注意 .done().fail() 承诺中的不同警报消息。

      //var b = document.getElementById('proizvod')?.value;
      $.ajax({
        url: '@Url.Action("IzbrisiProizvod", "Proizvod")',
        data: {
          id: 'someData'
        }
      }).done(function() {
        alert('success');
      }).fail(function() {
        alert('error');
      });
    
      console.log('i fire no matter what');
    

    【讨论】:

    • 它不起作用,页面刷新速度太快,我无法捕捉到任何东西,但你的回答实际上给了我一个想法,我想我解决了。
    • 很高兴它能够提供帮助
    猜你喜欢
    • 2012-08-23
    • 1970-01-01
    • 2013-11-20
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    相关资源
    最近更新 更多