代码之家  ›  专栏  ›  技术社区  ›  Geeth

从codebehind到jquery的参数[母版页]

  •  0
  • Geeth  · 技术社区  · 14 年前

    我正在使用jquery在母版页中创建菜单。我正在使用$.ajax()将链接的ID传递给jquery。

    问题:

    Getting failed: Showing error message in AjaxFailed(result) function.
    

    代码:html[jquery]

    $.ajax({
                 type: "POST",
                url: "Master.Master.cs/UserStatus",
                contentType: "application/json; charset=utf-8",
                data: "{}",
                dataType: "json",
                success: AjaxSucceeded,
                error: AjaxFailed
            });
    
    function AjaxSucceeded(result) {
    
            if (result.d.length != 0) {
                for (var i = 0; i < result.d.length; i++) {
                    $(result.d[i]).hide();
                }
            }
        }
    
        function AjaxFailed(result) {
            alert("Error");
        }  
    

    C代码:代码隐藏

    private static List<string> xx;
    [WebMethod]
        public static List<string> UserStatus()
        {
            return xx;
        }
    protected void Page_Load(object sender, EventArgs e)
        {
            xx = new List<string> {"#ll1", "#ll2" };
    
        }
    
    4 回复  |  直到 14 年前
        1
  •  1
  •   Mattias Jakobsson    14 年前

    webmethod属性的作用是说该方法应该响应特定的URL(有点像ASP.NET MVC中的路由)。因为我不使用webforms,所以我不知道当它决定方法应该响应什么URL时,它使用了什么逻辑。但我的猜测是,URL应该类似于“master.cs/userstatus”(不确定.cs扩展名)。当然,这是一个相对的URL,所以您可以尝试如下操作: <%=ResolveUrl("~/Master.cs/UserStatus")%> (如果母版页在根文件夹中)。那么您的示例应该是这样的:

    $.ajax({
            type: "POST",
            url: '<%=ResolveUrl("~/Master.cs/UserStatus")%>',
            contentType: "application/json; charset=utf-8",
            data: "{}",
            dataType: "json",
            success: AjaxSucceeded,
            error: AjaxFailed
        });
    

    更新

    .cs扩展名可能错误。但我认为你不应该把它放在母版页上。如果您想使用Ajax,您可能应该在Web服务或.ashx处理程序中使用它。但是对于您的最后一条评论,您似乎不需要使用Ajax(如果您不需要,则不需要)。您在注释中编写的代码中的问题可能是ID错误(请记住,您需要使用JavaScript中的客户机ID)。

    但我可能会这样做:

    <script type="text/javascript">
        var statuses = [];
        <%foreach(var status in UserStatus()) {%>
            statuses.push(<%=status%>);
        <%}%>
    </script>
    

    这将在浏览器中呈现此javascript:

    <script type="text/javascript">
        var statuses = [];
    
            statuses.push("#ll1");
            statuses.push("#ll2");
    
    </script>
    

    那么你的状态将在 statuses 数组。

        2
  •  1
  •   MytyMyky    14 年前

    就像上面提到的Andre和Mattias一样,不提供.cs扩展,因此您必须使用.aspx扩展才能访问WebMethod。

    我在您的示例中看到的问题是,您将方法放置在masterpage中(它将具有.master扩展名),而masterpage也不提供服务,因此您不能从中调用web方法。

    您可以使用的解决方法是在继承自页面的类中定义它,并让所有页面继承自该类。因为它是一个公共方法,所以它将在所有页面上都是公共的,因此是可用的。基本,项目页面的基本页。在这种情况下,您只需要使用当前页面的地址进行呼叫。只有当你在每一页上都会用到它,比如菜单时,这才有用。

    您可以使用的第二个解决方法是在项目中放置的.asmx WebService中定义WebMethod。它的工作方式类似于在页面上调用webmthod,只有您需要使用.asmx webservice的地址而不是页面的地址来进行调用。

        3
  •  0
  •   Fermin    14 年前

    如果您没有这样做,您需要将[ScriptService]属性添加到您的WebMethod中,如下所示

    指示Web服务可以 从脚本调用

    参见 ScriptServiceAttribute

        4
  •  0
  •   Andre Kraemer    14 年前

    我认为问题在于你试图将其发布到.cs文件。由于安全原因,ISS不提供扩展.cs。因此,即使您的方法在代码隐藏文件中有效,您也必须发布到.aspx文件。ASP.NET将为您完成其余的工作。 所以尝试:

    $.ajax({
             type: "POST",
            url: "/Master.Master.aspx/UserStatus",
            contentType: "application/json; charset=utf-8",
            data: "{}",
            dataType: "json",
            success: AjaxSucceeded,
            error: AjaxFailed
        });
    
    function AjaxSucceeded(result) {
    
        if (result.d.length != 0) {
            for (var i = 0; i < result.d.length; i++) {
                $(result.d[i]).hide();
            }
        }
    }
    
    function AjaxFailed(result) {
        alert("Error");
    }