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

jQuery+WebMethod+UrlRewriteing:如何区分参数和服务器方法名称

  •  0
  • Budda  · 技术社区  · 11 年前

    我的ASP.NET网站将URL转换为 http://smth.com/player/1234 进入请求“播放器”页面,参数为id=1234

    在页面上,我需要对此页面上的“GetData”方法进行web请求。我想使用jQuery来完成请求。我找到的所有教程( http://encosia.com/using-jquery-to-directly-call-aspnet-ajax-page-methods/ 例如)建议在“$.ajax”的“URL”参数中传递URL/方法名称

    $.ajax({
      type: "POST",
      url: "PageName.aspx/MethodName", // in my case that will be ... what?
      data: "{}",
      contentType: "application/json; charset=utf-8",
      dataType: "json",
      success: function(msg) {
        // Do something interesting here.
      }
    });
    

    问题是,如果我指定“player/1234/GetData”,那么将对“player”页面进行请求,但ASP.NET不会调用GetData方法。。。

    我应该在此页面上实现自定义逻辑并调用“GetData”以执行web请求吗?如果是,我如何识别对WebMethod的请求?

    或者我应该以如下方式提供“普通”url http://smth.com/player.aspx?Id=1234/GetData

    我可能错过了什么?jquery是否允许在单独的字段中指定“方法名称”?或者我应该配置我的网站来正确处理这个问题?

    请告知。欢迎有任何想法!

    2 回复  |  直到 11 年前
        1
  •  1
  •   Eduardo Roth    11 年前

    布达,我在遇到同样的问题时看到了你的问题。

    我的解决方案,可能不是最好的,是在我的呼叫中添加一个假扩展,在我的情况下是“jq”,如下所示:

    url: "<%: ResolveUrl("~/PagePath/PageName.aspx") %>/WebMethod.jq"
    

    因为我有一条规则可以删除扩展名,另一条规则是在我需要使用的URL末尾添加斜线 <%: ResolveUrl("~/PagePath/PageName.aspx") %> . 这是因为当我输入页面时,我的URL是 http://hostname/PagePath/PageName/ 如果我通过ajax调用WebMethod,url最终会变成 http://hostname/PagePath/PageName/PageName.aspx/WebMethod.jq .

    添加此伪扩展后,您必须添加一个新的重写规则,以便在最终执行之前将其删除:

    <rule name="Clean Page WebMethods">
       <match url="(.*)\.jq$" />
       <action type="Rewrite" url="{R:1}" redirectType="Permanent" />
    </rule>
    

    如果你有任何其他规则,你必须跳过它们并附加一个条件,例如,如果你使用一个规则来删除扩展,你可能需要添加规则的条件,如下所示:

    <add input="{R:2}" negate="true" pattern="\.jq" />
    

    我正在使用 {R:2} 因为我发现URL重写模块不接受 WebMethod.jq 作为url的一部分,如果它发现 aspx 扩大这个 {R:2} 这将是我的模式,但可能会随着你规则的模式而改变。

    对于只使用PageWebMethod来说,这听起来可能过于复杂,但在初始配置之后,您只需要添加 .jq 脚本中调用的扩展。

    希望这对你有帮助!

        2
  •  0
  •   Budda    11 年前

    不知道如何解决这个问题。。所以我改为向web服务发出请求(URL包含绕过URL重写的.asmx)。。。

    如果你知道如何解决原来的问题,请提供建议!