WebForms UnobtrusiveValidationMode nécessite un ScriptResourceMapping pour «jquery». Veuillez ajouter un ScriptResourceMapping nommé jquery (sensible à la casse)

305

Je crée une application Web à l'aide de Visual Studio 2012. J'essaie d'ajouter le nombre de mots dans ma zone de texte. Cependant après avoir ajouté les codes javascript et les codes html. Je reçois l'erreur comme indiqué ci-dessus.

Voici mes codes javascript

Code:

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

Codes de serveur dans la page maître

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

Codes ASPX, (codes 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
la source

Réponses:

576

Vous avez besoin d'une clé web.config pour activer le mode de validation pré 4.5.

Plus d'informations sur ValidationSettings: UnobtrusiveValidationMode :

Spécifie comment ASP.NET permet globalement aux contrôles de validation intégrés d'utiliser du JavaScript discret pour la logique de validation côté client.

Type: UnobtrusiveValidationMode

Valeur par défaut: aucune

Remarques: Si cette valeur de clé est définie sur "Aucun" [par défaut], l'application ASP.NET utilisera le comportement antérieur à 4.5 (JavaScript en ligne dans les pages) pour la logique de validation côté client. Si cette valeur de clé est définie sur "WebForms" , ASP.NET utilise des attributs de données HTML5 et du JavaScript lié tardivement à partir d'une référence de script ajoutée pour la logique de validation côté client.

Exemple:

    <appSettings>
      <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
    </appSettings>
ericdc
la source
14
Pourquoi est-ce même un problème ... Pourquoi ne pourrait-il pas simplement être désactivé par défaut? Qui voudrait jamais que cela soit activé de toute façon? Quelles que soient les réponses, j'ai ajouté cette clé et je reçois toujours l'erreur ...
Ortund
40
Il semble que "Aucun" ne soit pas la valeur par défaut si vous utilisez targetFramework="4.5". J'ai dû explicitement ajouter ce paramètre à mon web.config pour que cela fonctionne.
Jesse Webb du
18
Rappel: le parent <appSettings> dans le fichier web.Config doit être l'élément racine, c'est-à-dire <configuration>.
GY
4
J'ai installé .Net 4.5.2 puis je suis tombé dans ce problème. Je suppose que la mise à jour Windows pour 4.5.2 a changé la configuration de la machine.
Rez.Net
3
Pourquoi voudriez-vous désactiver la validation discrète à moins que vous n'essayiez de gagner un concours de la "plus grande taille de page"?
EKW
173

Plutôt que de désactiver une nouvelle fonctionnalité, j'ai choisi de suivre les instructions de l'erreur. Dans mon global.asax.cs, j'ai ajouté:

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

Cela provient d'un article de blog msdn qui met en évidence certains des avantages des mappages de ressources de script. Un intérêt particulier pour moi était le contrôle centralisé de la livraison des fichiers de script basé sur "debug = true", EnableCDN, etc.

b_levitt
la source
@b_levitt Je suis un peu nouveau sur le .NET et j'ai trouvé la solution que vous avez mentionnée. Cela a en effet beaucoup aidé mais juste curieux de savoir comment puis-je appeler la fonction jQuery. Par exemple, j'ai un menu jQuery et après avoir implémenté la méthode ci-dessus, j'utilise <script type='text/javascript'> //<![CDATA[ $(document).ready(function () { $("#menu").menu(); }) //]] </script>. Est-ce la bonne approche?
Yashman Gupta
8
Création d'un résumé : gist.github.com/monoman/ca42e54cdac25ef2284b améliorant en ne codant pas en dur la valeur jQueryVer;
Monoman
6
REMARQUE: j'ai ajouté ces deux packages Nuget et les choses se sont bien passées. a dû copier de nouveaux fichiers dans le dossier / bin sur le serveur de production .. nuget.org/packages/Microsoft.AspNet.Web.Optimization nuget.org/packages/AspNet.ScriptManager.jQuery
htm11h
1
Cela dépend de votre cas d'utilisation, lequel est correct. Notre application n'a aucune validation (purement la diffusion de contenu) et nous avons préféré tout désactiver.
Samantha Branham
93

Il existe au moins trois façons de désactiver l'utilisation de JavaScript discret pour la validation côté client:

  1. Ajoutez ce qui suit au fichier web.config:
    <configuration>
      <appSettings>
        <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
      </appSettings>
    </configuration>
  2. Définissez la valeur de la System.Web.UI.ValidationSettings.UnobtrusiveValidationModepropriété statique surSystem.Web.UI.UnobtrusiveValidationMode.None
  3. Définissez la valeur de la System.Web.UI.Page.UnobtrusiveValidationModepropriété d'instance surSystem.Web.UI.UnobtrusiveValidationMode.None

Pour désactiver la fonctionnalité page par page, je préfère définir la Page.UnobtrusiveValidationModepropriété à l'aide de la directive page:

<%@ Page Language="C#" UnobtrusiveValidationMode="None" %>
Ryan Prechel
la source
7
Bon appel sur le paramètre par page.
Brendan Hannemann
47

La validation discrète est activée par défaut dans la nouvelle version d'ASP.NET. La validation discrète vise à réduire la taille de la page en remplaçant le JavaScript en ligne pour effectuer la validation par une petite bibliothèque JavaScript qui utilise jQuery.

Vous pouvez le désactiver en modifiant web.config pour inclure les éléments suivants:

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

Ou mieux encore, configurez-le correctement en modifiant la méthode Application_Start dans 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 page 399 du début d'ASP.NET 4.5.1 en C # et VB fournit une discussion sur les avantages de la validation discrète et une procédure pas à pas pour la configurer.

Pour ceux qui recherchent RouteConfig. Il est ajouté automatiquement lorsque vous créez un nouveau projet dans Visual Studio dans le dossier App_Code. Le contenu ressemble à ceci:

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
la source
D'où vient RouteConfig?
Lucas
@Lucas Lorsque vous créez un nouveau projet avec Visual Studio, il ajoute RouteConfig.cs au dossier App_Code. Voir la réponse modifiée.
denver
12

pour ajouter un peu plus à la réponse de b_levitt ... sur 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"
            });
        }
    }
}

sur votre 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
la source
12

Je crois avoir rencontré le même dilemme. J'ai commencé à rencontrer le problème lorsque j'ai changé pour:

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

Ce qui donne le message d'erreur que vous décrivez ci-dessus.

ajouter:

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

Résout le problème, mais cela fait que vos contrôles / scripts de validation génèrent des erreurs d'exécution Javascript. Si vous changez pour:

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

Vous devriez être OK, mais vous devrez vous assurer que le reste de votre code se comporte / se comporte comme vous le souhaitez. Vous devrez peut-être également renoncer à certaines nouvelles fonctionnalités uniquement disponibles à partir de la version 4.5.

PS Il est fortement recommandé de lire ce qui suit avant de mettre en œuvre cette solution. Surtout, si vous utilisez la fonctionnalité Async:

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

MISE À JOUR avril 2017: Après quelques expérimentations et tests, j'ai trouvé une combinaison qui fonctionne:

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

avec:

jQuery version 1.11.3

DaniDev
la source
6

Le problème est survenu en raison du validateur de contrôle. Ajoutez simplement la référence J Query à votre page Web comme suit, puis ajoutez les paramètres de validation dans votre fichier web.config pour résoudre le problème. Moi aussi, j'ai fait face au même problème et ce qui suit a donné la solution à mon problème.

Étape 1:

Code à ajouter dans la page Web

Étape 2 :

Code à ajouter dans le fichier Web.config

Cela résoudra votre problème.

Ivan
la source
Pourquoi devriez-vous ajouter Jquery après avoir défini UnobtrusiveValidationMode sur aucun?
Ashin
0

Il y a 3 solutions que d'autres gars ont dites à supérieur ... mais lorsque vous essayez la solution Application_Start, mon autre bibliothèque jQuery comme Pickup_Date_and_Time ne fonctionne pas ... alors je teste la deuxième façon et il est répondu: 1- définissez le FrameWork cible sur Pre 4.5 2 - Utilisez "UnobtrusiveValidationMode =" None "" dans l'en-tête de votre page =>

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

cela fonctionne pour moi et ne perturbe pas mon autre fonction jQuery.

Ata Hoseini
la source