Отключить валидатор ASP.NET 1.1 с помощью JavaScript - не работает в Firefox - PullRequest
1 голос
/ 04 сентября 2010

Следующая попытка работает в IE8, но не в Firefox (для этого нельзя использовать JQuery):

case 'Template:templateControl:residenceRBL2': 
    if (selected.value == 'Within USA') 
    {
        /* Enable zip textbox and validator */
 document.getElementById("Template_templateControl_zipTxt1").disabled=false;
 ValidatorEnable(document.getElementById('<%=firstPersonZipReqVal.ClientID%>'),
            true);
 ...
    }
    else if (selected.value == 'Outside USA') 
    {
        /* Disable zip textbox and validator */
 document.getElementById("Template_templateControl_zipTxt1").disabled=true;
 ValidatorEnable(document.getElementById('<%=firstPersonZipReqVal.ClientID%>'),
            false);
 ...
    }
    break;

    <asp:Label ID="firstPersonZipLabel" Runat="server"></asp:Label><br />
 <asp:TextBox ID="zipTxt1" Height="19" Width="100" 
        Runat="server"></asp:TextBox>
    <asp:RequiredFieldValidator ID="firstPersonZipReqVal" 
        ControlToValidate="zipTxt1" Display="Dynamic" 
            ErrorMessage="First Person Zip" 
                Runat="server">*</asp:RequiredFieldValidator>

Описание проблемы: В зависимости от выбора списка радиокнопок, требуемый валидатор отключается / повторно включается для текстового поля. По сути, если их адрес находится за пределами США, то валидатор zip-текстового поля отключен. В Firefox это не будет работать вообще.

ОБНОВЛЕНИЕ 1: 09-07-2010 Я отключил текстовое поле в Firefox; Я использовал атрибут имени вместо идентификатора. Моя единственная проблема сейчас заключается в том, как получить доступ к «ClientID» валидатора ASP.NET в JS?

ОБНОВЛЕНИЕ 2: 09-07-2010 Согласно документации MSDN , я думал, что смогу сделать что-то вроде этого:

ValidatorEnable(firstPersonZipReqVal, false);

К сожалению, в Firefox это тоже не работает ...

Неисправность ASP.NET при проверке кода на стороне клиента проверки в Firefox

ОБНОВЛЕНИЕ 3: 09-08-2010

Причина, по которой Firefox не работает хорошо, заключается в том, что ASP.NET 1.1 рассматривает его как браузер нижнего уровня. Если я добавлю clientTarget = "upLevel" в тег Page, Firefox будет работать как положено. К сожалению, это нарушает весь макет сайта. Есть ли более постепенный способ исправления колпачков браузера для Firefox? Эта версия browserCaps также нарушает макет.

Текущие пробки браузера в Web.Config выглядят так:

 <browserCaps> 
  <case match="Gecko/[-\d]+">
   browser=Netscape
   frames=true
   tables=true
   cookies=true
   javascript=true
   javaapplets=true
   ecmascriptversion=1.5
   w3cdomversion=1.0
   css1=true
   css2=true
   xml=true
   tagwriter=System.Web.UI.HtmlTextWriter
   <case match="rv:1.0[^\.](?'letters'\w*)">
    version=6.0
    majorversion=6
    minorversion=0
    <case match="^b" with="${letters}">
     beta=true
    </case>
   </case>
   <case match="rv:1(\.\d+)(\.\d)?(?'letters'\w*)">
    version=7.0
    majorversion=7
    minorversion=0
    <case match="^b" with="${letters}">
     beta=true
    </case>
   </case>
  </case>
 </browserCaps>

ОБНОВЛЕНИЕ: 09-11-2010

Следующая ссылка может дать ответ; может кто-нибудь помочь с кодом на 50 баллов?

http://www.4guysfromrolla.com/articles/051204-1.aspx

Ответы [ 5 ]

1 голос
/ 07 сентября 2010

как получить доступ к «ClientID» Управление валидатором ASP.NET в JS

Вы правильно обращаетесь к нему в своем коде, хотя вам может понадобиться использовать двойные кавычки вместо одинарных:

document.getElementById("<%=firstPersonZipReqVal.ClientID%>")
0 голосов
/ 06 декабря 2013

хорошо, вопрос очень старый, но fr1.1 еще жив - на самом деле статья Митчелла не предоставляет обходного пути, позвольте мне показать мой:
1. Web config browserCaps должен содержать «msdomversion», что-то вроде этого:

        <browserCaps>
        <case match="^Mozilla/5\.0 \([^)]*\) (Gecko/[-\d]+)(?'VendorProductToken' (?'type'[^/\d]*)([\d]*)/(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*)))?">
            browser=Gecko
            <filter>
                <case match="(Gecko/[-\d]+)(?'VendorProductToken' (?'type'[^/\d]*)([\d]*)/(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*)))">
                type=${type}
                </case>
                <case>
                    <!-- plain Mozilla if no VendorProductToken found -->
                type=Mozilla
                </case>
            </filter>
            frames=true
            tables=true
            cookies=true
            javascript=true
            javaapplets=true
            ecmascriptversion=1.2 
            w3cdomversion=1.0
            css1=true
            css2=true
            xml=true
            msdomversion=6.0
            tagwriter=System.Web.UI.HtmlTextWriter
            <case match="rv:(?'version'(?'major'\d+)(?'minor'\.\d+)(?'letters'\w*))">
                version=${version}
                majorversion=0${major}
                minorversion=0${minor}
                <case match="^b" with="${letters}">
                    beta=true
                </case>
            </case>
        </case>
        <case match="Chrome/(?'version'(?'major'\d+)\.(?'minor'\d+\.\d+).\d+)">
            browser=Chrome
            version=${version}
            majorversion=${major}
            minorversion=${minor}
            frames=true
            tables=true
            cookies=true
            javascript=true
            javaapplets=true
            ecmascriptversion=1.5
            w3cdomversion=1.0
            msdomversion=6.0
            css1=true
            css2=true
            xml=true
            tagwriter=System.Web.UI.HtmlTextWriter
        </case>
    </browserCaps>

2. WebUIValidation.js должен быть изменен:
2.1 заменить вызовы document.all на document.getElementById (Mitchell)
2.2 переименовать переменную в "финал" (Митчелл)
2.3 добавить функцию для чтения в качестве атрибутов:

function ValidatorValidatorGetAttribute(item, attribName)
{
    var retVal = null;
    var attribs = item.attributes;
    for (var i = attribs.length - 1; i >= 0; i--)
    {
        var attrib = attribs[i];
        if (attrib.nodeName == attribName)
        {
            retVal = attrib.nodeValue;
        }
    }
    return retVal;
}

2.4 добавить логику обработки эксплоонов, например, в ValidatorOnLoad:

if (typeof(val.evaluationfunction) == "string") {
    eval("val.evaluationfunction = " + val.evaluationfunction + ";");
}
else
if (typeof(ValidatorGetAttribute(val,'evaluationfunction')) == "string") {
    eval("val.evaluationfunction = " + ValidatorGetAttribute(val,'evaluationfunction') + ";");
}

3. Добавить клиентский скрипт на странице (автоматический скрипт проверяет, работает ли он только в браузере IE)

var nonIEBrowser = false;
if (typeof(clientInformation) == "undefined")
    nonIEBrowser = true;
if ((typeof(clientInformation) != "undefined") && (clientInformation.appName.indexOf("Explorer") == -1))
    nonIEBrowser = true;
//None - IE browsers, and possibly IE 10+ 
if (nonIEBrowser) 
{
    if (typeof(Page_ValidationVer) == "undefined")
        alert("Unable to find script library '/aspnet_client/system_web/1_1_4322/WebUIValidation.js'. Try placing this file manually, or reinstall by running 'aspnet_regiis -c'.");
    else if (Page_ValidationVer != "125")
        alert("This page uses an incorrect version of WebUIValidation.js. The page expects version 125. The script library is " + Page_ValidationVer + ".");
    else
        ValidatorOnLoad();
}

вот и все. По крайней мере, у меня это работает :)

0 голосов
/ 13 сентября 2010

Помечено как ответ - см. Ссылку на статью Скотта Митчелла на эту тему выше.

0 голосов
/ 08 сентября 2010

Я считаю, что проблема в том, что вы вызываете Javascript до того, как DOM будет готов , поэтому не можете найти ваши элементы с помощью getElementByID.

Существует 2 решения.

  1. Визуализируйте свой JavaScript в нижней части страницы, по крайней мере после элементов управления .
  2. Поместите вызов Javascript в функциюи сначала вызовите его с помощью window.onload .

И вам обязательно нужно вызвать их с предложением palswim, используя <% = firstPersonZipReqVal.ClientID%>

Я не на 100% уверен, что это проблема, потому что я не вижу полный код, но это основная причина, когда getElementByID не находит существующий элемент управления.

0 голосов
/ 08 сентября 2010

Это слишком долго, чтобы добавить к комментарию и является отдельным ударом при ответе из моего поста выше.

Я просто копирую и вставляю из сообщение об этой проблеме , но пользователь попробовал что-то вроде этого:

function disableValidator(elem)
{
    elem.style.cssText = "";
    elem.style.display = 'none';
    elem.style.accelerator = true;
}

disableValidator( document.getElementById("<%=firstPersonZipReqVal.ClientID%>") );
...