WebForms UnobtrusiveValidationMode требует ScriptResourceMapping для «jquery». Пожалуйста, добавьте ScriptResourceMapping с именем jquery (с учетом регистра)

305

Я создаю веб-приложение с использованием Visual Studio 2012. Я пытаюсь добавить количество слов в мое текстовое поле. Однако после добавления кодов JavaScript и HTML-кодов. Я получаю ошибку, как указано выше.

Вот мой код JavaScript

Код:

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

Коды сервера на главной странице

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

ASPX коды, (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>
Тео Чуен Вэй Брайан
источник

Ответы:

576

Вам нужен ключ web.config, чтобы включить режим проверки до 4.5.

Дополнительная информация о валидацииНастройки: UnobtrusiveValidationMode :

Определяет, как ASP.NET глобально позволяет встроенным элементам управления валидатора использовать ненавязчивый JavaScript для логики валидации на стороне клиента.

Тип: UnobtrusiveValidationMode

Значение по умолчанию: Нет

Примечания. Если для этого значения ключа установлено значение «Нет» [по умолчанию], приложение ASP.NET будет использовать поведение до версии 4.5 (встроенный JavaScript на страницах) для логики проверки на стороне клиента. Если для этого ключевого значения установлено значение «WebForms» , ASP.NET использует атрибуты данных HTML5 и JavaScript с поздней привязкой из добавленной ссылки на скрипт для логики проверки на стороне клиента.

Пример:

    <appSettings>
      <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
    </appSettings>
ericdc
источник
14
Почему это даже проблема ... Почему это нельзя просто отключить по умолчанию? Кто бы вообще хотел, чтобы это было включено? Безотносительно ответов я добавил этот ключ, и я все еще получаю ошибку ...
Ortund
40
Кажется, «Нет» не по умолчанию, если вы используете targetFramework="4.5". Я должен был явно добавить этот параметр в мой web.config, чтобы он работал.
Джесси Уэбб
18
Напоминание: родительский элемент <appSettings> в файле web.Config должен быть корневым элементом, то есть <configuration>.
GY
4
Я установил .Net 4.5.2, а затем попал в эту проблему. Я предполагаю, что обновление Windows для 4.5.2 изменило конфигурацию машины.
Rez.Net
3
Зачем вам отключать ненавязчивую проверку, если вы не пытаетесь выиграть в конкурсе "самый большой размер страницы"?
EKW
173

Вместо того, чтобы отключить новую функцию, я решил следовать инструкциям по ошибке. В моем global.asax.cs я добавил:

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

Это происходит из сообщения в блоге msdn, в котором освещаются некоторые преимущества сопоставления ресурсов сценариев. Особый интерес для меня был централизованный контроль над доставкой файлов сценариев на основе «debug = true», EnableCDN и т. Д.

b_levitt
источник
@b_levitt Я новичок в .NET и нашел решение, которое вы упомянули. Это действительно очень помогло, но просто любопытно, как я могу вызвать функцию jQuery. Например, у меня есть меню jQuery и после реализации вышеупомянутого метода я использую <script type='text/javascript'> //<![CDATA[ $(document).ready(function () { $("#menu").menu(); }) //]] </script>. Это правильный подход?
Яшман Гупта
8
Создан gist: gist.github.com/monoman/ca42e54cdac25ef2284b, улучшенный за счет отсутствия жесткого кодирования значения jQueryVer;
Monoman
6
ПРИМЕЧАНИЕ: я добавил эти два пакета Nuget, и все прошло гладко. пришлось скопировать новые файлы в папку / bin на рабочий сервер .. nuget.org/packages/Microsoft.AspNet.Web.Optimization nuget.org/packages/AspNet.ScriptManager.jQuery
htm11h
1
Зависит от вашего варианта использования, который является правильным. Наше приложение не имеет никакой проверки (исключительно доставка контента), и мы предпочли отключить его.
Саманта Бранхам
93

Существует как минимум три способа отключить использование ненавязчивого JavaScript для проверки на стороне клиента:

  1. Добавьте следующее в файл web.config:
    <configuration>
      <appSettings>
        <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
      </appSettings>
    </configuration>
  2. Установите значение System.Web.UI.ValidationSettings.UnobtrusiveValidationModeстатического свойства равнымSystem.Web.UI.UnobtrusiveValidationMode.None
  3. Установите значение System.Web.UI.Page.UnobtrusiveValidationModeсвойства экземпляра равнымSystem.Web.UI.UnobtrusiveValidationMode.None

Чтобы отключить функциональность для каждой страницы, я предпочитаю устанавливать Page.UnobtrusiveValidationModeсвойство с помощью директивы page:

<%@ Page Language="C#" UnobtrusiveValidationMode="None" %>
Райан Пречел
источник
7
Приятный звонок на постраничную настройку.
Брендан Ханнеманн
47

Ненавязчивая проверка по умолчанию включена в новой версии ASP.NET. Ненавязчивая проверка направлена ​​на уменьшение размера страницы путем замены встроенного JavaScript для выполнения проверки на небольшую библиотеку JavaScript, которая использует jQuery.

Вы можете отключить его, отредактировав web.config и включив в него следующее:

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

Или, что еще лучше, правильно настройте его, изменив метод Application_Start в 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"
        }
    );
}

Страница 399 из Начиная с ASP.NET 4.5.1 в C # и VB рассказывает о преимуществах ненавязчивой проверки и пошаговом руководстве по ее настройке.

Для тех, кто ищет RouteConfig. Он добавляется автоматически при создании нового проекта в Visual Studio в папку App_Code. Содержимое выглядит примерно так:

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);
        }
    }
}
денвер
источник
Откуда берется RouteConfig?
Лукас
@Lucas Когда вы создаете новый проект в Visual Studio, он добавляет RouteConfig.cs в папку App_Code. Смотрите отредактированный ответ.
Денвер
12

добавить еще немного к ответу от b_levitt ... на 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"
            });
        }
    }
}

на вашем 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
источник
12

Я считаю, что столкнулся с тем же затруднением. Я начал сталкиваться с проблемой, когда я изменился на:

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

Что дает сообщение об ошибке, которое вы описали выше.

добавив:

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

Решает проблему, но затем она заставляет ваши элементы управления / сценарии проверки выдавать ошибки времени выполнения Javascript. Если вы измените на:

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

Вы должны быть в порядке, но вы должны убедиться, что остальная часть вашего кода работает / ведет себя так, как нужно. Возможно, вам также придется отказаться от некоторых новых функций, доступных только в версии 4.5.

PS Настоятельно рекомендуется прочитать следующее перед внедрением этого решения. Особенно, если вы используете функциональность Async:

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

ОБНОВЛЕНИЕ Апрель 2017: После некоторого эксперимента и тестирования я придумал комбинацию, которая работает:

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

с участием:

JQuery версия 1.11.3

DaniDev
источник
6

Проблема возникла из-за валидатора Control. Просто добавьте ссылку на J-запрос на свою веб-страницу следующим образом, а затем добавьте параметры проверки в файл web.config, чтобы устранить эту проблему. Я тоже столкнулся с той же проблемой, и нижеприведенное дало решение моей проблемы.

Шаг 1:

Код для добавления на веб-страницу

Шаг 2 :

Код для добавления в файл Web.config

Это решит вашу проблему.

Иван
источник
Почему вы должны добавить Jquery после установки UnobtrusiveValidationMode в none?
Ашин
0

У него есть 3 решения, о которых другие ребята рассказали выше ... но когда попробуете решение Application_Start, моя другая библиотека jQuery, такая как Pickup_Date_and_Time, не работает ... поэтому я тестирую второй способ, и мне отвечают: 1 - установите Target FrameWork в Pre 4.5 2 - Используйте "UnobtrusiveValidationMode =" None "" в заголовке вашей страницы =>

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

это работает для меня и не нарушает мою другую функцию jQuery.

Ата Хосейни
источник