WebForms UnobtrusiveValidationMode richiede ScriptResourceMapping per 'jquery'. Aggiungi uno ScriptResourceMapping chiamato jquery (sensibile al maiuscolo / minuscolo)


305

Sto creando un'applicazione Web utilizzando Visual Studio 2012. Sto tentando di aggiungere il conteggio delle parole nella mia casella di testo. Tuttavia dopo aver aggiunto i codici javascript e i codici html. Ricevo l'errore come indicato sopra.

Ecco i miei codici javascript

Codice :

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

Codici del server nella pagina principale

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

Codici ASPX, (codici 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>

Risposte:


576

È necessaria una chiave web.config per abilitare la modalità di validazione pre 4.5.

Ulteriori informazioni su ValidationSettings: UnobtrusiveValidationMode :

Specifica in che modo ASP.NET abilita globalmente i controlli di convalida integrati per utilizzare JavaScript discreto per la logica di convalida lato client.

Tipo: UnobtrusiveValidationMode

Valore predefinito: nessuno

Note: se questo valore chiave è impostato su "Nessuno" [impostazione predefinita], l'applicazione ASP.NET utilizzerà il comportamento precedente alla 4.5 (JavaScript inline nelle pagine) per la logica di convalida lato client. Se questo valore chiave è impostato su "WebForms" , ASP.NET utilizza attributi di dati HTML5 e JavaScript associato in ritardo da un riferimento di script aggiunto per la logica di convalida lato client.

Esempio:

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

14
Perché questo è anche un problema ... Perché questo non può essere disabilitato per impostazione predefinita? Chi lo vorrebbe mai abilitato comunque? Qualunque sia la risposta, ho aggiunto questa chiave e sto ancora ricevendo l'errore ...
Ortund,

40
Sembra che "Nessuno" non sia l'impostazione predefinita se si sta utilizzando targetFramework="4.5". Ho dovuto aggiungere esplicitamente questa impostazione al mio web.config per farlo funzionare.
Jesse Webb,

18
Promemoria: <appSettings> parent nel file web.Config dovrebbe essere l'elemento root, ovvero <configuration>.
GY

4
Ho installato .Net 4.5.2 e poi ho riscontrato questo problema. Presumo che l'aggiornamento di Windows per 4.5.2 abbia cambiato la configurazione della macchina.
Rez.Net,

3
Perché disabilitare la convalida discreta a meno che non si stia tentando di vincere un concorso di "dimensione pagina più grande"?
EKW,

173

Invece di disabilitare una nuova funzionalità, ho scelto di seguire le istruzioni dell'errore. Nel mio global.asax.cs ho aggiunto:

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

Questo deriva da un post sul blog msdn che evidenzia alcuni dei vantaggi della mappatura delle risorse degli script. Di particolare interesse per me è stato il controllo centralizzato sulla consegna dei file di script basati su "debug = true", EnableCDN, ecc.


@b_levitt Sono un tipo nuovo di .NET e ho trovato la soluzione che hai citato. In effetti ha aiutato molto, ma solo curioso come posso chiamare la funzione jQuery. Ad esempio, ho un menu jQuery e dopo aver implementato il metodo sopra che sto usando <script type='text/javascript'> //<![CDATA[ $(document).ready(function () { $("#menu").menu(); }) //]] </script>. È questo l'approccio corretto?
Yashman Gupta,

8
Creato un riassunto : gist.github.com/monoman/ca42e54cdac25ef2284b migliorando non codificando il valore jQueryVer;
Monoman,

6
NOTA: ho aggiunto questi due pacchetti Nuget e le cose sono andate bene. ho dovuto copiare nuovi file nella cartella / bin sul server di produzione .. nuget.org/packages/Microsoft.AspNet.Web.Optimization nuget.org/packages/AspNet.ScriptManager.jQuery
htm11h

1
Dipende dal tuo caso d'uso quale è corretto. La nostra app non ha alcuna convalida (consegna di contenuti puramente) e abbiamo preferito disattivare tutto.
Samantha Branham,

93

Esistono almeno tre modi per disabilitare l'uso di JavaScript discreto per la convalida lato client:

  1. Aggiungi quanto segue al file web.config:
    <configuration>
      <appSettings>
        <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
      </appSettings>
    </configuration>
  2. Impostare il valore della System.Web.UI.ValidationSettings.UnobtrusiveValidationModeproprietà statica suSystem.Web.UI.UnobtrusiveValidationMode.None
  3. Impostare il valore della System.Web.UI.Page.UnobtrusiveValidationModeproprietà dell'istanza suSystem.Web.UI.UnobtrusiveValidationMode.None

Per disabilitare la funzionalità in base alla pagina, preferisco impostare la Page.UnobtrusiveValidationModeproprietà utilizzando la direttiva page:

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

7
Bella chiamata sull'impostazione per pagina.
Brendan Hannemann,

47

La convalida discreta è abilitata per impostazione predefinita nella nuova versione di ASP.NET. La convalida discreta mira a ridurre le dimensioni della pagina sostituendo JavaScript incorporato per eseguire la convalida con una piccola libreria JavaScript che utilizza jQuery.

Puoi disabilitarlo modificando web.config per includere quanto segue:

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

O meglio ancora configurarlo correttamente modificando il metodo Application_Start in 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"
        }
    );
}

Pagina 399 di inizio ASP.NET 4.5.1 in C # e VB offre una discussione sui vantaggi della convalida discreta e una procedura dettagliata per la configurazione.

Per chi cerca RouteConfig. Viene aggiunto automaticamente quando si crea un nuovo progetto in Visual Studio nella cartella App_Code. Il contenuto è simile al seguente:

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

Da dove proviene RouteConfig?
Lucas,

@Lucas Quando crei un nuovo progetto con Visual Studio, aggiunge RouteConfig.cs alla cartella App_Code. Vedi risposta modificata.
denver

12

per aggiungere altro alla risposta di b_levitt ... su 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"
            });
        }
    }
}

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>

12

Credo di aver riscontrato lo stesso dilemma. Ho iniziato a riscontrare il problema quando sono passato a:

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

Che dà il messaggio di errore che hai descritto sopra.

aggiungendo:

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

Risolve il problema, ma i controlli / gli script di convalida generano errori di runtime JavaScript. Se cambi in:

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

Dovresti essere OK, ma dovrai assicurarti che il resto del codice funzioni / si comporti come desiderato. Potrebbe anche essere necessario rinunciare ad alcune nuove funzionalità disponibili solo dalla 4.5 in poi.

PS Si consiglia vivamente di leggere quanto segue prima di implementare questa soluzione. In particolare, se si utilizza la funzionalità Async:

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

AGGIORNAMENTO Aprile 2017: dopo alcuni esperimenti e test ho trovato una combinazione che funziona:

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

con:

jQuery versione 1.11.3


6

Il problema si è verificato a causa del validatore del controllo. Aggiungi il riferimento J Query alla tua pagina web come segue e quindi aggiungi le Impostazioni di convalida nel tuo file web.config per superare il problema. Anch'io ho affrontato lo stesso problema e il seguito ha dato la soluzione al mio problema.

Passo 1:

Codice da aggiungere nella pagina web

Passo 2 :

Codice da aggiungere nel file Web.config

Risolverà il tuo problema.


Perché dovresti aggiungere Jquery dopo aver impostato UnobtrusiveValidationMode su none?
Ashin,

0

Ha 3 soluzioni che altri ragazzi hanno detto a Upper ... ma quando provo la soluzione Application_Start, la mia altra libreria jQuery come Pickup_Date_and_Time non funziona ... quindi collaudo il secondo modo e mi viene risposto: 1- imposto Target FrameWork su Pre 4.5 2 - Utilizzare "UnobtrusiveValidationMode =" None "" nell'intestazione della pagina =>

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

funziona per me e non interrompe la mia altra funzione jQuery.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.