WebForms UnobtrusiveValidationMode wymaga ScriptResourceMapping dla „jquery”. Dodaj ScriptResourceMapping o nazwie jquery (wielkość liter ma znaczenie)

305

Tworzę aplikację internetową za pomocą programu Visual Studio 2012. Próbuję dodać liczbę słów do mojego pola tekstowego. Jednak po dodaniu kodów javascript i kodów HTML. Otrzymuję błąd, jak podano powyżej.

Oto moje kodowanie javascript

Kod :

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

Kody serwera na stronie wzorcowej

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

Kody ASPX, (kody 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
źródło

Odpowiedzi:

576

Potrzebujesz klucza web.config, aby włączyć tryb sprawdzania poprawności wcześniejszy niż 4.5.

Więcej informacji na temat ValidationSettings: UnobtrusiveValidationMode :

Określa, w jaki sposób program ASP.NET globalnie umożliwia wbudowanym kontrolerom sprawdzania poprawności używanie dyskretnego kodu JavaScript w logice sprawdzania poprawności po stronie klienta.

Wpisz: UnobtrusiveValidationMode

Wartość domyślna: brak

Uwagi: Jeśli ta wartość klucza jest ustawiona na „Brak” [domyślnie], aplikacja ASP.NET będzie używać zachowania wcześniejszego niż 4.5 (wbudowany JavaScript na stronach) do logiki sprawdzania poprawności po stronie klienta. Jeśli ta wartość klucza jest ustawiona na „WebForms” , ASP.NET korzysta z atrybutów danych HTML5 i spóźnionego JavaScript z dodanego odwołania do skryptu do dla logiki sprawdzania poprawności po stronie klienta.

Przykład:

    <appSettings>
      <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
    </appSettings>
ericdc
źródło
14
Dlaczego jest to nawet problem ... Dlaczego nie można tego domyślnie wyłączyć? Kto by kiedykolwiek chciał to włączyć? Bez względu na odpowiedzi dodałem ten klucz i nadal
pojawia się
40
Wydaje się, że „Brak” nie jest domyślnym ustawieniem, jeśli używasz targetFramework="4.5". Musiałem jawnie dodać to ustawienie do mojego pliku web.config, aby działało.
Jesse Webb
18
Przypomnienie: element nadrzędny <appSettings> w pliku web.Config powinien być elementem głównym, czyli <konfiguracja>.
GY,
4
Zainstalowałem .Net 4.5.2, a potem wpadłem w ten problem. Zakładam, że aktualizacja systemu Windows dla wersji 4.5.2 zmieniła konfigurację komputera.
Rez.Net
3
Dlaczego miałbyś wyłączać dyskretne sprawdzanie poprawności, chyba że próbujesz wygrać konkurs „największy rozmiar strony”?
EKW
173

Zamiast wyłączać nową funkcję, zdecydowałem się postępować zgodnie z instrukcjami błędu. W moim global.asax.cs dodałem:

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

Pochodzi z postu na blogu msdn, który podkreśla niektóre zalety mapowania zasobów skryptów. Szczególnie zainteresował mnie scentralizowana kontrola nad dostarczaniem plików skryptów w oparciu o „debug = true”, EnableCDN itp.

b_levitt
źródło
@b_levitt Jestem całkiem nowy w .NET i przeszedłem przez wspomniane rozwiązanie. Rzeczywiście bardzo pomogło, ale po prostu ciekawi, jak mogę wywołać funkcję jQuery. Na przykład mam menu jQuery i po wdrożeniu powyższej metody używam <script type='text/javascript'> //<![CDATA[ $(document).ready(function () { $("#menu").menu(); }) //]] </script>. Czy to jest właściwe podejście?
Yashman Gupta,
8
Utworzono gist: gist.github.com/monoman/ca42e54cdac25ef2284b, poprawiając nie kodując na stałe wartości jQueryVer;
Monoman
6
UWAGA: Dodałem te dwa pakiety Nuget i wszystko poszło gładko. musiał skopiować nowe pliki w folderze / bin na serwer produkcyjny .. nuget.org/packages/Microsoft.AspNet.Web.Optimization nuget.org/packages/AspNet.ScriptManager.jQuery
htm11h
1
Zależy od przypadku użycia, który z nich jest poprawny. Nasza aplikacja nie ma żadnej walidacji (dostarczanie wyłącznie treści) i woleliśmy ją wyłączyć.
Samantha Branham
93

Istnieją co najmniej trzy sposoby, aby wyłączyć użycie dyskretnego JavaScript do sprawdzania poprawności po stronie klienta:

  1. Dodaj następujące pliki do pliku web.config:
    <configuration>
      <appSettings>
        <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
      </appSettings>
    </configuration>
  2. Ustaw wartość System.Web.UI.ValidationSettings.UnobtrusiveValidationModewłaściwości static naSystem.Web.UI.UnobtrusiveValidationMode.None
  3. Ustaw wartość System.Web.UI.Page.UnobtrusiveValidationModewłaściwości instance naSystem.Web.UI.UnobtrusiveValidationMode.None

Aby wyłączyć tę funkcję dla poszczególnych stron, wolę ustawić Page.UnobtrusiveValidationModewłaściwość za pomocą dyrektywy strony:

<%@ Page Language="C#" UnobtrusiveValidationMode="None" %>
Ryan Prechel
źródło
7
Ładne połączenie w ustawieniach na stronę.
Brendan Hannemann
47

Dyskretne sprawdzanie poprawności jest domyślnie włączone w nowej wersji programu ASP.NET. Dyskretna walidacja ma na celu zmniejszenie rozmiaru strony poprzez zamianę wbudowanego kodu JavaScript w celu przeprowadzenia walidacji na małą bibliotekę JavaScript korzystającą z jQuery.

Możesz go wyłączyć, edytując plik web.config, aby uwzględnić następujące elementy:

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

Lub lepiej, ale odpowiednio skonfiguruj, modyfikując metodę Application_Start w 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"
        }
    );
}

Strona 399 z początku programu ASP.NET 4.5.1 w języku C # i VB zawiera omówienie korzyści z dyskretnej weryfikacji i instrukcje konfiguracji.

Dla tych, którzy szukają RouteConfig. Jest dodawany automatycznie po utworzeniu nowego projektu w Visual Studio do folderu App_Code. Zawartość wygląda mniej więcej tak:

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
źródło
Skąd pochodzi RouteConfig?
Lucas,
@Lucas Kiedy tworzysz nowy projekt w Visual Studio, dodaje RouteConfig.cs do folderu App_Code. Zobacz zredagowaną odpowiedź.
denver
12

dodać trochę więcej do odpowiedzi od b_levitt ... na 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"
            });
        }
    }
}

na 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
źródło
12

Myślę, że spotkałem ten sam problem. Problem zacząłem napotykać, kiedy zmieniłem na:

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

Co daje komunikat o błędzie opisany powyżej.

dodając:

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

Rozwiązuje problem, ale powoduje, że formanty sprawdzające / skrypty sprawdzają błędy środowiska wykonawczego Javascript. Jeśli zmienisz na:

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

Powinieneś być OK, ale musisz upewnić się, że reszta kodu działa / zachowuje się tak, jak chcesz. Być może będziesz musiał zrezygnować z niektórych nowych funkcji dostępnych tylko od wersji 4.5.

PS Zdecydowanie zalecamy zapoznanie się z poniższymi informacjami przed wdrożeniem tego rozwiązania. Zwłaszcza jeśli korzystasz z funkcji Async:

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

AKTUALIZACJA Kwiecień 2017: Po kilku eksperymentach i testach wymyśliłem kombinację, która działa:

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

z:

jQuery wersja 1.11.3

DaniDev
źródło
6

Problem wystąpił z powodu sprawdzania poprawności kontroli. Po prostu dodaj odwołanie J Query do swojej strony internetowej w następujący sposób, a następnie dodaj ustawienia sprawdzania poprawności w pliku web.config, aby rozwiązać problem. Ja również stanąłem przed tym samym problemem, a poniższe rozwiązania rozwiązały mój problem.

Krok 1:

Kod do dodania na stronie internetowej

Krok 2 :

Kod do dodania w pliku Web.config

To rozwiąże twój problem.

Ivan
źródło
Dlaczego warto dodać Jquery po ustawieniu UnobtrusiveValidationMode na none?
Ashin
0

Ma 3 rozwiązania, o których wspominali inni faceci ... ale kiedy wypróbowałem Application_Start, Moja inna biblioteka jQuery, taka jak Pickup_Date_and_Time, nie działa ... więc testuję drugi sposób i odpowiedź: 1- ustaw docelową ramkę na Pre 4.5 2 - Użyj „UnobtrusiveValidationMode =„ None ”w nagłówku strony =>

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

działa dla mnie i nie zakłóca mojej innej funkcji jQuery.

Ata Hoseini
źródło