【问题标题】:Web method not being called未调用 Web 方法
【发布时间】:2011-12-14 14:33:04
【问题描述】:

我正在使用从 JavaScript 调用 Web 方法的 VB.Net 页面,这在一周前还可以正常工作,现在由于某种原因无法正常工作。我想知道是否有人能给我任何想法,因为我现在完全迷路了。

首先我的页面会生成一个可以点击的项目列表,执行此操作的行是:

 TicketHTML = TicketHTML + "<td><img src='../images/delete.png' Class='imgTicketClose'  alt='Delete Task' onclick='DeleteTicket(" + row("id").ToString() + ")' /></td></tr>"

我知道这是有效的,因为当单击该项目时我会弹出一个 javascript 弹出窗口,所以我认为问题不在这里。

现在我的 Javascript:

    function DeleteTicket(ticketID) 
     {
        var answer = confirm("Do you really want to delete this task?")
        if (answer) 
        {
           PageMethods.DeleteTask(ticketID);
           window.location.reload()
        }
     }

我认为问题出在此处,因为 web 方法似乎从未调用过,并且页面似乎也没有重新加载,但我不明白为什么如果 javascript 显示确认对话框会失败。

为了完整起见,这里是我的 web 方法,虽然我知道这没有被调用,因为我已经分析了数据库。

 <System.Web.Services.WebMethod()>
   Public Shared Sub DeleteTask(ticketID As Integer)
  Dim conn As New SqlConnection(ConfigurationManager.ConnectionStrings("Blueprint").ToString())

  Dim cmd As New SqlCommand
  cmd.CommandType = CommandType.StoredProcedure
  cmd.CommandText = "spDeleteNonTicketItem"
  cmd.Parameters.AddWithValue("@ItemID", ticketID)

  cmd.Connection = conn

  conn.Open()

  cmd.ExecuteNonQuery()

  conn.Close()

   End Sub

那么我在哪里可以看?任何建议将不胜感激。谢谢

编辑:web.config 文件中的任何内容会阻止页面方法执行吗? 我刚刚注意到这种情况发生在一个完全独立的 Web 方法中,并检查了使用 alert() 传递到 javascript 中的整数,它们都是有效的

【问题讨论】:

  • 你可以用javascript执行VB函数吗? :O
  • @Shvelo 是的:D 我有这个工作一段时间,但不知道为什么它不再工作了
  • 在C#中你需要将你的方法标记为[WebMethod],不了解VB
  • 您可能想尝试在您的函数中放置一个断点以确保它没有被调用。如果函数被调用,但在它到达 conn.Open() 函数之前抛出异常,那么观察你的 DB 分析器不会告诉你任何事情。
  • DeleteTask 是否用 属性修饰?它需要从客户端“可访问”。这最近被删除了吗?另外,是否有任何 javascript 错误?

标签: javascript asp.net vb.net


【解决方案1】:

您是否能够确认它正在尝试执行 PageMethod,就像您设置断点时一样,它是否会命中它?

我不知道这是否会导致您出现问题,但我确实看到了:

function DeleteTicket(ticketID) 
 {
    var answer = confirm("Do you really want to delete this task?");
    if (answer) 
    {
       PageMethods.DeleteTask(ticketID);
       window.location.reload();
    }
 }

我想知道添加分号是否会给您带来问题。

【讨论】:

  • 刚刚看到缺少的 javascript 分号 - 很好。我敢打赌,这就是阻止 JS 函数按预期执行的原因。
  • 信不信由你,分号是可选的。但这并不意味着您不应该使用它们。见mislav.uniqpath.com/2010/05/semicolons
  • 好电话,但很抱歉添加 javascript 分号没有帮助:(
【解决方案2】:

编辑 - 我可以看到您添加了 WebMethod 属性。

您可以做的一件事是在您的页面方法调用中添加一个错误处理程序。您通常可以为 onsuccess 和 onError 提供方法处理程序。

例如,您可以添加以下 javascript 方法:

function OnFailed(error) {
   // Alert user to the error.
   alert(error.get_message());
}

然后,在您的 PageMethods 调用中:

    function DeleteTicket(ticketID)    
    {      
        var answer = confirm("Do you really want to delete this task?");      
        if (answer)       
        {         
            PageMethods.DeleteTask(ticketID, null, OnFailed);         
            window.location.reload();      
        }   
    } 

刚刚发现一个带有example of this 的 StackOverflow 问题。还要注意 web.config 中 CustomError 的影响。

进一步编辑。

你最近有发布过吗?

您需要确保:

1) 在页面的 ScriptManager 上,设置了 EnablePageMethods="true"

2) Web.config 的相关部分应包含以下几行:

<system.web>
<httpHandlers>
<remove verb="*" path="*.asmx"/>
<add verb="*" path="*.asmx" 
type="Microsoft.Web.Script.Services.ScriptHandlerFactory" 
validate="false"/>
</httpHandlers>
<httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpModules>
</system.web> 

【讨论】:

  • 感谢您的回答,由于 括号,WebMethod 属性刚刚被 SO 隐藏。我现在已将其添加回我的示例中,也完全没有错误。如果不对很多值的硬编码进行大量更改,我就无法在本地进行调试,因此很难正确调试该项目,但我很确定它没有达到该方法
  • 刚刚检查了传入的整数并且它们是有效的,我现在也看到另一种网络方法发生这种情况,两者都在一周左右前工作,所以我想知道是否可能缺少某些东西来自允许这些工作的 web.config?
  • 谢谢破折号。是脚本管理器,我的老板做了一些优化,并在我正在处理的部分添加了一个母版页,他删除了我的脚本管理器并在母版页中添加了一个,但它缺少 EnablePageMethods 属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 2016-12-25
相关资源
最近更新 更多