网络方法未被触发

webmethod is not fired

我第一次尝试获取从 javascript 调用的服务器端函数时没有成功,因为没有调用 web 方法。

aspx 文件包含一个 bootstrap 样式的按钮;单击时,我需要向用户的 "Favorites" 列表添加一条记录(在数据库中添加一条记录)。

该页面继承自母版页并且母版页包含:

<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 方法,然后它在警告框上显示页面源(当然是部分)。

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

我可以在我的本地机器上重现这个。注意到脚本模块没有在web.config!

中的modules部分注册

确保在 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 设置为关闭,否则页面方法请求将 return 401 UnAuthorized。 RouteConfig中的代码应该设置如下:

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

如果您想保留 Friendly 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);  
}  

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

不得不问,只是为了确定:那些js函数在脚本标签内? (我想是的,如果 'success' 被击中。只是检查一下。)

再检查一次:需要 using 语句背后的代码:using System.Web.Services;.