【问题标题】:service call via jQuery通过 jQuery 调用服务
【发布时间】:2009-04-27 11:22:19
【问题描述】:

我正在尝试使用 jquery 编写用户名验证,我正在使用 jmsajax 插件。我已经测试了 web 服务,它工作正常。 我遇到了错误。
网络服务代码

[System.Web.Script.Services.ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    [WebMethod]
    public bool check_username(string uname)
    {
        DBMOdelDataContext db = new DBMOdelDataContext();
        var q = from p in db.users
                where p.username == uname
                select p;             
        if (q.Count() == 0)
            return false;
        else
            return true; 
    }

jQuery 代码。

$(document).ready(function() {
        $(".unamebtn").blur(function() {                
            $uname = $(this).val();

            $.jmsajax({
                type: "POST",
                url: "Services/MyServices.asmx",                    
                data:"{userName='" + $uname + "'}",
                method: "check_username",
                dataType: "msjson",
                success: function(result) {
                    $("#msg").html(result);
                    alert(result);
                    $("#msg").addClass("notice");
                }
            });                
        });
    });

它抛出的异常。
{"Message":"无法将 \u0027System.String\u0027 类型的对象转换为 \u0027System.Collections 类型 .Generic.IDictionary`2[System.String,System.Object]\u0027","StackTrace":" 在 System.Web.Script.Serialization .ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer 序列化器, Boolean 在 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain 处的 throwOnError, Object& convertObject)\r\n (Object o, Type type, JavaScriptSerializer 序列化器, Boolean throwOnError, Object&convertedObject )\r\n 在 System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType(Object o, Type type, JavaScriptSerializer 序列化程序)\r\n 在 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer 序列化程序、字符串输入、类型类型、Int32 depthLimit)\r\n 在 System.Web.Script.Serialization.JavaScriptSerializer .Deserialize[T](字符串输入)\r\n 在 System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest (HttpContext 上下文,JavaScriptSerializer 序列化程序)\r\n 在 System.Web.Script.Services.RestHandler .GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n 在 System.Web.Script.Services .RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType" :"System.InvalidOperationException"}

【问题讨论】:

  • 跛脚,我给了你两次答案,比你接受的答案提前 24 小时

标签: asp.net jquery ajax


【解决方案1】:
data: {uname:$uname},

实际上必须查看文档,jMs 与普通的 jQuery 有点不同。 在普通的 jQuery 中,它只是:

$.ajax({
    type: "POST",
    url: "Services/MyServices.asmx/check_username",
   data: "{uname:'" + $uname + "'}",
  datatype : 'json',
contentType : 'application/json',
    success: function(data) {
        $("#div").html(String(data));
    }
});

另外,请禁用 GET 请求以避免 CSRF 安全问题。

[ScriptMethod( UseHttpGet = false, ResponseFormat = ResponseFormat.Json )]

【讨论】:

  • 抱歉,不返回 IDictionary,无法返回接口。只返回字典
  • 这可能是另一种返回 IDictionary 的方法。注释掉服务中的所有其他方法。某些东西正在尝试序列化 IDictionary,但这是行不通的。仔细检查您是否还有 .net 3.5 SP1。
  • 现在出现错误:“消息”:“无效的 JSON 原语:uname。”
  • 确保它的 {uname: $uname} 或 "{uname:" + $uname + "}" 我从未使用过 jmsa 的东西,只是标准 jquery
  • 我说的是默认的 ajax 调用。
【解决方案2】:

你试过了吗?

$.jmsajax({
    ...
    data: { uname: $uname },
    ...
});

【讨论】:

  • 搞砸了,我比你早一天发的
【解决方案3】:

我遇到了同样的问题,发现我在 jQuery 调用中不知不觉地提交了一个字典对象。当提交的对​​象类型未映射到您的 web 方法预期的参数时,似乎会出现错误。如果您没有为 $.ajax(...) 调用中的“数据”字段提供正确的标识符,您将收到此错误。确保为数据字段提供标识符:

{param_name:"值"}

而不是我在做什么 {{field1:"value",field2:value}}

嵌套数据将导致 .net 尝试将对象反序列化为字典。如果你的 webmethod 需要一个 Dictionary 对象,那没关系,否则就没有那么多了。

【讨论】:

    【解决方案4】:

    只是一个注释,并没有深入,但是当我在方法签名上使用 ByRef 而不是 ByVal 时出现了这个错误!没有看我在做什么,错过了很多次看代码的东西——针线和干草堆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      相关资源
      最近更新 更多