O WebForms UnobtrusiveValidationMode requer um ScriptResourceMapping para 'jquery'. Adicione um ScriptResourceMapping chamado jquery (diferencia maiúsculas de minúsculas)


305

Estou criando um aplicativo Web usando o Visual Studio 2012. Estou tentando adicionar a contagem de palavras à minha caixa de texto. No entanto, após adicionar os códigos javascript e os códigos html. Eu recebo o erro como indicado acima.

Aqui estão os meus códigos javascript

Código:

function validateLimit(obj, divID, maxchar) {

objDiv = get_object(divID);

if (this.id) obj = this;

var remaningChar = maxchar - trimEnter(obj.value).length;

if (objDiv.id) {
    objDiv.innerHTML = remaningChar + " characters left";
}
if (remaningChar <= 0) {
    obj.value = obj.value.substring(maxchar, 0);
    if (objDiv.id) {
        objDiv.innerHTML = "0 characters left";
    }
    return false;
}
else
{ return true; }
}

function get_object(id) {
var object = null;
if (document.layers) {
    object = document.layers[id];
} else if (document.all) {
    object = document.all[id];
} else if (document.getElementById) {
    object = document.getElementById(id);
}
return object;
}

function trimEnter(dataStr) {
return dataStr.replace(/(\r\n|\r|\n)/g, "");
}

Códigos de servidor na página mestra

<script type="text/javascript" src="js/JScript.js" ></script>

Códigos ASPX, (códigos HTML)

<tr>
<th style="width: 595px; height: 135px;">Official Report :</th>
<td colspan="4" style="height: 135px">
  <asp:TextBox ID="tbofficial" runat="server" Height="121px" TextMode="MultiLine" Width="878px" MaxLength="500"   ToolTip="Summary:(500 characters)" onkeyup="return validateLimit(this, 'lblMsg1', 500)" ></asp:TextBox>
  <div id="lblMsg1">500 characters left</div>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" 
        ControlToValidate="tbofficial" Display="Dynamic" 
        SetFocusOnError="True">*</asp:RequiredFieldValidator>
  <br />
  <asp:Label ID="lblmsg" runat="server"></asp:Label>
  <br />
  <br />
        <asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" />
  <asp:Button ID="btnClear" runat="server" Text="Clear" OnClick="btnClear_Click" />
        </td>
</tr>

Respostas:


576

Você precisa de uma chave web.config para ativar o modo de validação anterior ao 4.5.

Mais informações sobre ValidationSettings: UnobtrusiveValidationMode :

Especifica como o ASP.NET globalmente permite que os controles do validador interno usem JavaScript discreto para lógica de validação do lado do cliente.

Tipo: UnobtrusiveValidationMode

Valor padrão: Nenhum

Comentários: Se esse valor da chave estiver definido como "Nenhum" [padrão], o aplicativo ASP.NET usará o comportamento anterior à 4.5 (JavaScript embutido nas páginas) para a lógica de validação do lado do cliente. Se esse valor da chave for definido como "WebForms" , o ASP.NET usará atributos de dados HTML5 e JavaScript vinculado tardiamente a partir de uma referência de script adicionada para a lógica de validação do lado do cliente.

Exemplo:

    <appSettings>
      <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
    </appSettings>

14
Por que isso é um problema ... Por que isso não pode ser desativado por padrão? Quem iria querer isso ativado de qualquer maneira? Quaisquer que sejam as respostas, eu adicionei esta chave e ainda estou recebendo o erro ...
— Ortund

40
Parece que "Nenhum" não é o padrão se você estiver usando targetFramework="4.5". Eu tive que adicionar explicitamente essa configuração ao meu web.config para que ele funcionasse.
— Jesse Webb

18
Lembrete: <appSettings> pai no arquivo web.Config deve ser o elemento raiz, que é <configuração>.
— GY

4
Instalei o .Net 4.5.2 e entrei nesse problema. Presumo que a atualização do Windows para 4.5.2 alterou a configuração da máquina.
— Rez.Net

3
Por que você desativaria a validação discreta, a menos que esteja tentando vencer uma competição de "maior tamanho de página"?
— EKW

173

Em vez de desativar um novo recurso, optei por seguir as instruções do erro. No meu global.asax.cs, adicionei:

protected void Application_Start(object sender, EventArgs e)
{
    string JQueryVer = "1.7.1";
    ScriptManager.ScriptResourceMapping.AddDefinition("jquery", new ScriptResourceDefinition
    {
        Path = "~/Scripts/jquery-" + JQueryVer + ".min.js",
        DebugPath = "~/Scripts/jquery-" + JQueryVer + ".js",
        CdnPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-" + JQueryVer + ".min.js",
        CdnDebugPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-" + JQueryVer + ".js",
        CdnSupportsSecureConnection = true,
        LoadSuccessExpression = "window.jQuery"
    });
}

Isso vem de uma postagem no blog msdn, que destaca algumas das vantagens dos mapeamentos de recursos de script. De particular interesse para mim, foi o controle centralizado sobre a entrega dos arquivos de script com base em "debug = true", EnableCDN, etc.


@b_levitt Eu sou um novato no .NET e vim através da solução que você mencionou. De fato, ajudou bastante, mas apenas curiosamente, como posso chamar a função jQuery. Por exemplo, eu tenho um menu jQuery e depois de implementar o método acima, estou usando <script type='text/javascript'> //<![CDATA[ $(document).ready(function () { $("#menu").menu(); }) //]] </script>. Essa é a abordagem correta?
— Yashman Gupta

8
Criou uma lista essencial: gist.github.com/monoman/ca42e54cdac25ef2284b melhorando não codificando o valor jQueryVer;
— Monoman 27/10

6
NOTA: Adicionei esses dois pacotes Nuget e as coisas correram bem. tinha que copiar novos arquivos na pasta / bin para servidor de produção .. nuget.org/packages/Microsoft.AspNet.Web.Optimization nuget.org/packages/AspNet.ScriptManager.jQuery
— htm11h

1
Depende do seu caso de uso, qual deles está correto. Nosso aplicativo não tem nenhuma validação (entrega puramente de conteúdo) e preferimos desativar tudo.
— Samantha Branham

93

Há pelo menos três maneiras de desativar o uso de JavaScript discreto para validação do lado do cliente:

  1. Adicione o seguinte ao arquivo web.config:
    <configuration>
      <appSettings>
        <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
      </appSettings>
    </configuration>
  2. Defina o valor da System.Web.UI.ValidationSettings.UnobtrusiveValidationModepropriedade estática comoSystem.Web.UI.UnobtrusiveValidationMode.None
  3. Defina o valor da System.Web.UI.Page.UnobtrusiveValidationModepropriedade da instância comoSystem.Web.UI.UnobtrusiveValidationMode.None

Para desativar a funcionalidade por página, prefiro definir a Page.UnobtrusiveValidationModepropriedade usando a diretiva de página:

<%@ Page Language="C#" UnobtrusiveValidationMode="None" %>

7
Boa chamada na configuração por página.
— Brendan Hannemann

47

A validação discreta é ativada por padrão na nova versão do ASP.NET. A validação discreta visa diminuir o tamanho da página, substituindo o JavaScript embutido para executar a validação por uma pequena biblioteca JavaScript que usa jQuery.

Você pode desativá-lo editando web.config para incluir o seguinte:

<appSettings>
  <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
</appSettings>

Ou melhor ainda, configure-o adequadamente, modificando o método Application_Start em global.asax:

void Application_Start(object sender, EventArgs e) 
{
    RouteConfig.RegisterRoutes(System.Web.Routing.RouteTable.Routes);
    ScriptManager.ScriptResourceMapping.AddDefinition("jquery",
        new ScriptResourceDefinition
        {
            Path = "/~Scripts/jquery-2.1.1.min.js"
        }
    );
}

Página 399 de Início O ASP.NET 4.5.1 em C # e VB fornece uma discussão sobre os benefícios da validação discreta e uma explicação passo a passo para configurá-lo.

Para quem procura RouteConfig. Ele é adicionado automaticamente quando você cria um novo projeto no visual studio na pasta App_Code. O conteúdo é mais ou menos assim:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Routing;
using Microsoft.AspNet.FriendlyUrls;

namespace @default
{
    public static class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            var settings = new FriendlyUrlSettings();
            settings.AutoRedirectMode = RedirectMode.Permanent;
            routes.EnableFriendlyUrls(settings);
        }
    }
}

De onde vem o RouteConfig?
— Lucas

@ Lucas Quando você cria um novo projeto com o visual studio, ele adiciona RouteConfig.cs à pasta App_Code. Veja a resposta editada.
— Denver #

12

para adicionar um pouco mais à resposta de b_levitt ... no global.asax:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Web.UI;

namespace LoginPage
{
    public class Global : System.Web.HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            string JQueryVer = "1.11.3";
            ScriptManager.ScriptResourceMapping.AddDefinition("jquery", new ScriptResourceDefinition
            {
                Path = "~/js/jquery-" + JQueryVer + ".min.js",
                DebugPath = "~/js/jquery-" + JQueryVer + ".js",
                CdnPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-" + JQueryVer + ".min.js",
                CdnDebugPath = "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-" + JQueryVer + ".js",
                CdnSupportsSecureConnection = true,
                LoadSuccessExpression = "window.jQuery"
            });
        }
    }
}

no seu default.aspx

<body>
   <form id="UserSectionForm" runat="server">
     <asp:ScriptManager ID="ScriptManager" runat="server">
          <Scripts>
               <asp:ScriptReference Name="jquery" />
          </Scripts>
     </asp:ScriptManager>
     <%--rest of your markup goes here--%>         
   </form>
</body>

12

Acredito que encontrei o mesmo dilema. Comecei a encontrar o problema quando mudei para:

</system.web>
<httpRuntime targetFramework="4.5"/>

O que fornece a mensagem de erro que você descreve acima.

adicionando:

<appSettings>
  <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />

Resolve o problema, mas faz com que seus controles / scripts de validação gerem erros de tempo de execução do Javascript. Se você mudar para:

</system.web>
<httpRuntime targetFramework="4.0"/>

Você deve estar bem, mas precisará garantir que o restante do seu código se comporte conforme desejado. Talvez você precise renunciar a alguns novos recursos disponíveis apenas no 4.5 em diante.

PS É altamente recomendável que você leia o seguinte antes de implementar esta solução. Especialmente, se você usar a funcionalidade assíncrona:

https://blogs.msdn.microsoft.com/webdev/2012/11/19/all-about-httpruntime-targetframework/

ATUALIZAÇÃO abril de 2017: Depois de algumas experimentações e testes, criei uma combinação que funciona:

<add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
<httpRuntime targetFramework="4.5.1" />

com:

jQuery versão 1.11.3


6

O problema ocorreu devido ao validador de controle. Basta adicionar a referência de consulta J à sua página da web da seguinte maneira e, em seguida, adicione as configurações de validação no seu arquivo web.config para solucionar o problema. Eu também enfrentei o mesmo problema e o abaixo deu a solução para o meu problema.

Passo 1:

Código a ser adicionado na página da web

Passo 2 :

Código a ser adicionado no arquivo Web.config

Isso resolverá o seu problema.


Por que você deve adicionar o Jquery depois de definir UnobtrusiveValidationMode como none?
— Ashin

0

Ele tem 3 soluções que outros caras disseram para o superior ... mas quando tenta a solução Application_Start, minha outra biblioteca jQuery como Pickup_Date_and_Time não funciona ... então eu testei de segunda maneira e ele respondeu: 1- defina o Target FrameWork como Pre 4.5 2 - Use "UnobtrusiveValidationMode =" None "" no cabeçalho da sua página =>

<%@ Page Title="" Language="C#" 
    MasterPageFile="~/Master/MasteOfHotel.Master" 
    UnobtrusiveValidationMode="None" %>

funciona para mim e não interrompe minha outra função jQuery.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.