【问题标题】:webmethod is not firedwebmethod 没有被触发
【发布时间】:2017-05-24 13:10:33
【问题描述】:

我第一次尝试从 javascript 调用服务器端函数没有工作,因为 webmethod 没有被调用。

aspx 文件包含一个引导样式的按钮;点击后,我需要在用户的“收藏夹”列表中添加一条记录(在数据库中添加一条记录)。

页面继承自母版页,母版页包含:

<asp:ScriptManager runat="server" ID="ScriptManager1" EnablePageMethods="true" />

aspx 页面有:

<script type="text/javascript">
function addFavorite(url, friendly) {debugger
    PageMethods.AddFavorite(url, friendly, onSuccess);
}
function onSuccess(result, userContext, methodName) {debugger
    alert(result);
}
</script>

<button type="button" class="btn btn-primary btn-xs" onclick="addFavorite('some_url', 'some firendly name');">
<i class="fa fa-heart-o" aria-hidden="true"></i>Favorites</button>

在后面的代码中:

[WebMethod]
public static string AddFavorite(string sURL, string sFriendlyName)
{
    // This is where I would add a record to a DB table, but for testing ...
    return sFriendlyName;
}

当我点击按钮时,它会点击 addFavorites() 并立即 onSuccess 并绕过 web 方法,它会在警告框上显示页面源(当然是部分)。

我已经搜索过,但似乎不知道我做错了什么。所有示例都显示了我所采取的相同步骤。

【问题讨论】:

  • 我刚刚复制了代码,你的方法运行良好,在配置下使用可能会帮助你

标签: javascript c# asp.net webmethod


【解决方案1】:

我可以在我的本地机器上重现这个。注意到脚本模块未在 web.configmodules 部分中注册!

确保在 web.config 中包含以下脚本模块以使其工作:

<system.webServer>
          <modules>
           <!-- *...other registered modules..* -->
           <add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
           </modules>
    </system.webServer>

更新

确保将 FriendlyUrlSettings.AutoRedirectMode 设置为 Off,否则页面方法请求将返回 401 UnAuthorized。 RouteConfig中的代码应该设置如下:

public static class RouteConfig  
{  
    public static void RegisterRoutes(RouteCollection routes)  
    {  
        var settings = new FriendlyUrlSettings();  
        settings.AutoRedirectMode = RedirectMode.Off;  
        routes.EnableFriendlyUrls(settings);  
    }  
}  

如果您想保留友好 URL,则添加您自己的从 WebFormsFriendlyUrlResolver 继承的友好 url 解析器,如下所示:

public static class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        var settings = new FriendlyUrlSettings();
        settings.AutoRedirectMode = RedirectMode.Permanent;
        routes.EnableFriendlyUrls(settings, new WebMethodFriendlyUrlResolver());
    }
}

public class WebMethodFriendlyUrlResolver : WebFormsFriendlyUrlResolver
{
    public override string ConvertToFriendlyUrl(string path)
    {
        if (HttpContext.Current.Request.PathInfo != string.Empty)
        {
            return path;
        }
        else
        {
            return base.ConvertToFriendlyUrl(path);
        }
    }
}

如果启用友好 URL,则必须更新 JavaScript 回调函数以设置路径以明确包含 .aspx 扩展名:

function addFavorite(url, friendly) {  
        PageMethods.set_path(PageMethods.get_path() + '.aspx');  
        PageMethods.AddFavorite(url, friendly, onSuccess, onError);  
}  

【讨论】:

  • 试过了,但没有帮助。它确实抱怨“preCondition”,说它不是一个允许的属性。
  • 您使用的 ASP.NET/VS/IIS 的版本是什么?
  • .Net 4.5,VS 2017,IIS 7.5。
  • 您在调用页面方法时是否收到 401 UnAuthorized 异常? - 如果是这样,请尝试在 RouteConfig 中关闭 FriendlyUrlSettings 的 AutoRedirectMode 属性,如下所示: public static void RegisterRoutes(RouteCollection routes) { var settings = new FriendlyUrlSettings(); settings.AutoRedirectMode = RedirectMode.Off; routes.EnableFriendlyUrls(settings); }
  • 完美!那成功了。唯一的想法是,现在所有页面在 URL 中都有 blah.aspx 而不是友好名称(而不是“Home”,我有“default.aspx”)。是否可以有条件地将重定向模式设置为关闭?
【解决方案2】:

添加一个 onFailure 方法来查看它是否被命中。 (这可能是必需的,但我不肯定。) 编辑:我不认为这是必需的。我刚刚复制了你的代码,它在这里工作。

不得不问,只是为了确定:那些 js 函数在脚本标签内? (我想是的,如果“成功”受到打击。只是检查。)

再次检查:需要使用语句后面的代码:using System.Web.Services;

【讨论】:

  • 我不认为这会有所作为。你看表单代码示例,我在 JS 函数中添加了“调试器”; onSuccess 被命中并显示一些东西,但它不是我期望的 web 方法的结果,而是部分页面源。
  • 我认为它在 JS 警报框中(即在警报(结果)中)显示部分页面源的事实是一个线索。为什么页面源存储在 onSuccess() 函数的“result”参数中?
  • 也许追踪会找到一些东西。在浏览器中将/trace.axd 添加到url 的末尾并回车。
  • 谢谢,我这样做了,它实际上显示“Main/Default/AddFavorite”,状态码为 200(我相信这意味着成功)和“POST”作为动词。方法 (AddFavorite) 在文件“/Main/Default.aspx.cs”中。似乎该方法确实被命中,即使我在该方法中设置的断点没有被命中。此外,该方法只返回其应该显示在警报框中的参数之一(用于测试),而是在警报框中显示部分页面源。
  • 我还看到:localhost:51204/Scripts/WebForms/MsAjax/MicrosoftAjax.js0x800a138f 中第 6 行第 97862 列未处理的异常 - JavaScript 运行时错误:无法获取未定义或空引用的属性“webServiceFailedNoMsg”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 2012-06-03
  • 2019-11-07
  • 2018-09-01
  • 2018-12-03
  • 2021-04-23
  • 2019-01-30
相关资源
最近更新 更多