Проверка JQuery с WebForms и WebService - PullRequest
1 голос
/ 18 декабря 2010

Прямо сейчас у меня есть простая форма с одним входом.Я пытаюсь использовать удаленную часть jQuery Validate для вызова моего веб-сервиса, который сейчас просто возвращает false.Проблема, с которой я сталкиваюсь сейчас, заключается в том, что когда он вызывает мой веб-сервис, он вытягивает имя ввода, что является какой-то фигней, созданной .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 Внутренняя ошибка сервера, потому что моя подпись не соответствует моему сообщению.

Код веб-сервиса:

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

Спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 18 декабря 2010

К сожалению, насколько мне известно, невозможно обойти эту проблему при использовании серверных элементов управления ASP.Net WebForms, таких как <asp:textbox>.Хотя в .NET 4 у вас есть атрибут ClientIdMode="Static" ( см. Здесь ) для отключения автоматически сгенерированных идентификаторов клиентов, это не влияет на атрибут name.

Рик Штрал имеетв ответ на комментарии к его сообщению в блоге предложил, что если вам действительно нужны предсказуемые имена, вы должны просто использовать элемент управления html <input>:

ClientIDMode влияет только на идентификатор, а неАтрибут NAME в элементе управления, поэтому для элементов формы обратной отправки имя все равно будет длинным, как это указано в UniqueID.Это разумно, хотя ИМХО.Если вам действительно нужны простые имена, используйте простые элементы INPUT, а не элементы управления ASP.NET, особенно если вы все равно не полагаетесь на назначение элементов управления POSTBACK для получения значений с помощью Request.Form [].

Рассматривали ли вы просто использование клиентской <input> вместо <asp:textbox runat="server">?

Кроме того, вы рассматривали возможность удаления веб-форм ASP.NET и использования MVC?; -) * 1 021 *

0 голосов
/ 21 декабря 2010

Это ответ, который я придумал.Мне пришлось изменить текстовое поле asp: на ввод HTML, чтобы это работало.Кроме того, мне пришлось изменить web.config для всех HttpGet на мой веб-сервис.Это больно в лучшем случае.Я также потерял 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
            },
        });
...