jQuery使用WebForms&网络服务

时间:2010-12-17 21:52:37

标签: asp.net jquery asp.net-ajax jquery-validate

现在我有一个单一输入的简单形式。我正在尝试使用jQuery Validate的远程部分来调用我的webservice,现在只是返回false。我现在遇到的问题是当它调用我的webservice时它会拉出输入的名称,这是由.net创建的一些垃圾。有没有办法覆盖它并使用输入的Id和输入的名称。这是我的jQuery:

$(function () {
   $('form').validate();
    $("#tbSiteName").rules("add", {
        required: true,
        remote: "webservices/webservice.asmx/HelloWorld"
    });
});

这是我的HTML:

<label for="tbSiteName">Name:</label>
<input name="ctl00$MainContent$tbSiteName" type="text" id="tbSiteName" class="required" />

以下是Chrome的标题信息:(请注意查询字符串参数)

Accept:application/json, text/javascript, */*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Type:application/x-www-form-urlencoded
Cookie:ASP.NET_SessionId=qvupxcrg0yukekkni323dapj
Host:localhost:56803
Referer:http://localhost:56803/Default.aspx
User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10
X-Requested-With:XMLHttpRequest
Query String Parameters
ctl00%24MainContent%24tbSiteName:ts

从服务器端我收到500内部服务器错误,因为我的签名与我的帖子不符。

Webservice代码:

[WebMethod]
[ScriptMethod]
public bool HelloWorld(string tbSiteName) {
          return tbSiteName.Length > 5;
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

不幸的是,据我所知,使用ASP.Net WebForms服务器控件(如<asp:textbox>)时无法解决这个问题。虽然在.NET 4中,您具有ClientIdMode="Static"属性(see here)来禁用自动生成的客户端ID,但这不会影响name属性。

Rick Strahl建议回应他对blog post的评论,如果你真的需要可预测的名字,你应该只使用一个html <input>控件:

  

ClientIDMode仅影响控件上的ID而不影响NAME属性,因此对于回发表单元素,名称仍将是在UniqueID中保存的长名称。虽然恕我直言,这是合理的。如果你真的需要简单的名字,那么使用普通的INPUT元素而不是ASP.NET控件,特别是如果你不依赖POSTBACK控件分配来使用Request.Form []来检索值。

您是否考虑过仅使用客户端<input>而不是<asp:textbox runat="server">

此外,您是否考虑过删除ASP.NET WebForms并使用MVC? ; - )

答案 1 :(得分:0)

这是我想出的答案。我必须将我的asp:textbox更改为HTML输入才能使其正常工作。另外,我必须将web.config更改为所有HttpGet到我的webservice。这充其量是痛苦的。我通过使用标准输入也失去了对控件的viewstate。我很乐意将其转换为MVC,但这不是一个选择。

感谢您的帮助。

$("#tbSiteName").rules("add", {
            required: true,
            remote:  function() {
                var r = {
                    url: "/webservices/ipmws.asmx/SiteValid",
                    type: "POST",
                    data: "{'tbSiteName': '" + $('#tbSiteName').val() + "'}",
                    dataType: "json",
                    contentType: "application/json; charset=utf-8",
                    dataFilter: function(data) { return (JSON.parse(data)).d; } 
                }
                return r
            },
        });