You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript调用ASP.NET方法失败:无法触发ASCX后台CheckValidity方法

问题背景

我在共享文件夹中有default.js文件,需要动态传入ASPX文件名、方法名及参数,调用对应页面的后台方法,但当前代码无法触发FormUI.ascx.cs中的CheckValidity方法,尝试的jQuery代码也无效。


现有代码

1. default.js 代码

function ValidateParams(fromdate,Id)
{
 var exp=/^((((0?[13578])|(1[02]))[\/]((0?[1-9]|[0-2][0-9])|(3[01])))|(((0?[469])|(11))[\/]((0?[1-9]|[0-2][0-9])|(30)))|(0?[2][\/](0?[1-9]|[0-2][0-9])))[\/]\d{4}$/;
 var exp1=/^(\d{9})$/;
 if(exp.test(fromdate)&& exp1.test(Id)) 
 {
   CheckValidityofId("FormUI.CheckValidity",fromdate,Id)
 }
}

function CheckValidityofId(lookupFunction,fromdate,Id) {

    callback = function(response) {
    
        if (response.error) {
            alert(response.error);
        }
        else {
        
            if (response.value =="NotAssociated")
            {
            document.getElementById(MessageID).innerText="Number is not associated";
            }
            else
            {
            document.getElementById(MessageID).innerText="This is NOT eligible";
            }
            
            
        }
    }
    if (fromdate.length > 0 && Id.length >0) {
        eval(lookupFunction + "('" + fromdate + "','" + Id "'," + callback + ")");
    }
    return false;
}

2. FormUI.ascx.cs 后台代码

public partial class FormUI : UIView
{
  public string CheckValidity(string FromDate, string Id)
  {
          // logic goes here
  }
}

3. 尝试无效的jQuery代码

$.getJSON("Form1003UI.ascx\CheckEligibility", {
            Data: {
                FromDate: fromdate,
                Id: Id
              }, }, function (data) {
            // do stuff on callback
        });

问题原因及缺失项
  • ASCX无法直接被AJAX访问:ASCX是用户控件,必须依托宿主ASPX页面运行,不能直接通过URL请求或调用其方法。
  • 前端eval逻辑完全错误:FormUI.CheckValidity是服务器端C#方法,前端JS和后端C#运行在不同环境,eval只能执行前端JS代码,根本无法触达后端方法。
  • jQuery请求的多重错误:
    • 路径错误:不能直接请求ASCX文件,且路径中的反斜杠\需改为正斜杠/;方法名CheckEligibility与后台的CheckValidity不匹配。
    • 参数格式错误:$.getJSON的参数不需要嵌套在Data对象里,直接传递键值对即可。
  • 后台方法未配置为可AJAX调用:普通实例方法无法被前端AJAX直接调用,需标记为[WebMethod]且改为静态方法(ASP.NET WebForm规则)。

修复方案建议
  1. 调整后台方法:将CheckValidity改为静态方法并添加[WebMethod]标记,若需访问控件实例,可通过其他方式处理,或把方法移到宿主ASPX页面的后台代码中:
public partial class FormUI : UIView
{
  [System.Web.Services.WebMethod]
  public static string CheckValidity(string FromDate, string Id)
  {
          // 业务逻辑实现
          return "NotAssociated"; // 示例返回值
  }
}
  1. 修正前端AJAX请求:指向宿主ASPX页面,调整参数格式并处理返回结果:
function CheckValidityofId(pagePath, methodName, fromdate, Id) {
    $.getJSON(`${pagePath}/${methodName}`, {
        FromDate: fromdate,
        Id: Id
    }, function (data) {
        var response = data.d; // ASP.NET WebMethod返回结果会包装在d属性中
        if (response === "NotAssociated") {
            document.getElementById(MessageID).innerText = "Number is not associated";
        } else {
            document.getElementById(MessageID).innerText = "This is NOT eligible";
        }
    }).fail(function(jqXHR, textStatus, errorThrown) {
        alert("请求错误: " + errorThrown);
    });
}

// 调用示例
ValidateParams(fromdate, Id) {
    // ...原有校验逻辑
    CheckValidityofId("YourHostPage.aspx", "CheckValidity", fromdate, Id);
}
  1. 移除无效的eval逻辑:删除原CheckValidityofId中的eval调用,替换为上述AJAX请求逻辑。

内容的提问来源于stack exchange,提问作者AMDI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:17:03