WebForms UnobtrusiveValidationMode requiere un ScriptResourceMapping para 'jquery'. Agregue un ScriptResourceMapping llamado jquery (distingue entre mayúsculas y minúsculas)

305

Estoy creando una aplicación web con Visual Studio 2012. Estoy intentando agregar el recuento de palabras en mi cuadro de texto. Sin embargo, después de agregar los códigos javascript y los códigos html. Recibo el error como se indicó anteriormente.

Aquí están mis 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 en la página maestra

<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>
Teo Chuen Wei Bryan
fuente

Respuestas:

576

Necesita una clave web.config para habilitar el modo de validación pre 4.5.

Más información sobre los ajustes de validación: Modo de validación discreto :

Especifica cómo ASP.NET permite globalmente que los controles de validación integrados utilicen JavaScript discreto para la lógica de validación del lado del cliente.

Tipo: Modo de validación discreto

Valor predeterminado: ninguno

Observaciones: si este valor clave se establece en "Ninguno" [predeterminado], la aplicación ASP.NET utilizará el comportamiento anterior a 4.5 (JavaScript en línea en las páginas) para la lógica de validación del lado del cliente. Si este valor clave se establece en "WebForms" , ASP.NET usa atributos de datos HTML5 y JavaScript enlazado tarde de una referencia de script agregada para la lógica de validación del lado del cliente.

Ejemplo:

    <appSettings>
      <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
    </appSettings>
ericdc
fuente
14
¿Por qué es esto incluso un problema ... ¿Por qué no se puede deshabilitar por defecto? ¿Quién querría habilitar esto de todos modos? Cualesquiera que sean las respuestas, agregué esta clave y sigo recibiendo el error ...
Ortund
40
Parece que "Ninguno" no es el predeterminado si está utilizando targetFramework="4.5". Tuve que agregar explícitamente esta configuración a mi web.config para que funcione.
Jesse Webb
18
Recordatorio: <appSettings> padre en la web. El archivo de configuración debe ser el elemento raíz, es decir, <configuración>.
GY
44
Instalé .Net 4.5.2 y luego caí en este problema. Supongo que la actualización de Windows para 4.5.2 cambió la configuración de la máquina.
Rez.Net
3
¿Por qué deshabilitaría la validación discreta a menos que intente ganar un concurso de "tamaño de página más grande"?
EKW
173

En lugar de deshabilitar una nueva función, opté por seguir las instrucciones del error. En mi global.asax.cs agregué:

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"
    });
}

Esto proviene de una publicación de blog de msdn que destaca algunas de las ventajas de las asignaciones de recursos de script. De particular interés para mí fue el control centralizado sobre la entrega de los archivos de script basados ​​en "debug = true", EnableCDN, etc.

b_levitt
fuente
@b_levitt Soy un poco nuevo en .NET y encontré la solución que mencionaste. De hecho, ayudó mucho, pero es curioso cómo puedo llamar a la función jQuery. Por ejemplo, tengo un menú jQuery y después de implementar el método anterior estoy usando <script type='text/javascript'> //<![CDATA[ $(document).ready(function () { $("#menu").menu(); }) //]] </script>. ¿Es este el enfoque correcto?
Yashman Gupta
8
Creó una esencia: gist.github.com/monoman/ca42e54cdac25ef2284b mejorando al no codificar el valor jQueryVer;
Monoman
66
NOTA: Agregué estos dos paquetes de Nuget y todo salió bien. tuvo que copiar nuevos archivos en la carpeta / bin al servidor de producción .. nuget.org/packages/Microsoft.AspNet.Web.Optimization nuget.org/packages/AspNet.ScriptManager.jQuery
htm11h
1
Depende de su caso de uso cuál es el correcto. Nuestra aplicación no tiene ninguna validación (solo entrega de contenido) y preferimos desactivarla.
Samantha Branham
93

Hay al menos tres formas de deshabilitar el uso de JavaScript discreto para la validación del lado del cliente:

  1. Agregue lo siguiente al archivo web.config:
    <configuration>
      <appSettings>
        <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
      </appSettings>
    </configuration>
  2. Establezca el valor de la System.Web.UI.ValidationSettings.UnobtrusiveValidationModepropiedad estática enSystem.Web.UI.UnobtrusiveValidationMode.None
  3. Establezca el valor de la System.Web.UI.Page.UnobtrusiveValidationModepropiedad de instancia enSystem.Web.UI.UnobtrusiveValidationMode.None

Para deshabilitar la funcionalidad por página, prefiero configurar la Page.UnobtrusiveValidationModepropiedad usando la directiva de página:

<%@ Page Language="C#" UnobtrusiveValidationMode="None" %>
Ryan Prechel
fuente
77
Buena llamada en la configuración por página.
Brendan Hannemann
47

La validación discreta está habilitada de forma predeterminada en la nueva versión de ASP.NET. La validación discreta tiene como objetivo disminuir el tamaño de la página al reemplazar el JavaScript en línea para realizar la validación con una pequeña biblioteca de JavaScript que usa jQuery.

Puede deshabilitarlo editando web.config para incluir lo siguiente:

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

O mejor aún, configúrelo correctamente modificando el método Application_Start en 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"
        }
    );
}

La página 399 de Beginning ASP.NET 4.5.1 en C # y VB proporciona una discusión sobre el beneficio de la validación discreta y un tutorial para configurarla.

Para aquellos que buscan RouteConfig. Se agrega automáticamente cuando realiza un nuevo proyecto en Visual Studio en la carpeta App_Code. El contenido se parece a esto:

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);
        }
    }
}
denver
fuente
¿De dónde viene RouteConfig?
Lucas
@Lucas Cuando crea un nuevo proyecto con Visual Studio, agrega RouteConfig.cs a la carpeta App_Code. Ver respuesta editada.
Denver
12

para agregar un poco más a la respuesta de b_levitt ... en 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"
            });
        }
    }
}

en su 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>
BernieSF
fuente
12

Creo que me he encontrado con el mismo dilema. Comencé a encontrar el problema cuando cambié a:

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

Lo que da el mensaje de error que describió anteriormente.

agregando:

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

Resuelve el problema, pero luego hace que los controles / scripts de validación arrojen errores de tiempo de ejecución de Javascript. Si cambia a:

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

Deberías estar bien, pero deberás asegurarte de que el resto de tu código se comporta como se desea. Es posible que también deba renunciar a algunas funciones nuevas que solo están disponibles en 4.5 en adelante.

PD Se recomienda encarecidamente que lea lo siguiente antes de implementar esta solución. Especialmente, si usa la funcionalidad Async:

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

ACTUALIZACIÓN Abril de 2017: después de algunos experimentos y pruebas, se me ocurrió una combinación que funciona:

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

con:

jQuery versión 1.11.3

DaniDev
fuente
6

El problema se produjo debido al validador de control. Simplemente agregue la referencia de J Query a su página web de la siguiente manera y luego agregue la Configuración de validación en su archivo web.config para resolver el problema. Yo también enfrenté el mismo problema y el siguiente dio la solución a mi problema.

Paso 1:

Código para agregar en la página web

Paso 2 :

Código para agregar en el archivo Web.config

Resolverá tu problema.

Ivan
fuente
¿Por qué debería agregar Jquery después de establecer UnobtrusiveValidationMode en none?
Ashin
0

Tiene 3 soluciones que otros chicos le dijeron a la parte superior ... pero cuando intento la solución Application_Start, mi otra biblioteca jQuery como Pickup_Date_and_Time no funciona ... así que pruebo de segunda manera y responde: 1- establezco Target FrameWork en Pre 4.5 2 - Use "UnobtrusiveValidationMode =" None "" en el encabezado de su página =>

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

funciona para mí y no interrumpe mi otra función jQuery.

Ata Hoseini
fuente