Jak zmienić walidację wiadomości `` data-val-number '' w MVC podczas jej generowania przez pomocnika @Html


Załóżmy, że ten model:
Public Class Detail
...
<DisplayName("Custom DisplayName")>
<Required(ErrorMessage:="Custom ErrorMessage")>
Public Property PercentChange As Integer
...
end class

i widok z okna:
@Html.TextBoxFor(Function(m) m.PercentChange)

ten html będzie kontynuowany:
<input data-val="true" 
data-val-number="The field 'Custom DisplayName' must be a number."
data-val-required="Custom ErrorMessage"
id="PercentChange"
name="PercentChange" type="text" value="0"/>

Chcę dostosować komunikat o błędzie
data-val-number
, który, jak zakładam, został wygenerowany, ponieważ
PercentChange
to
Integer
. Szukałem takiego atrybutu, aby go zmienić,
range
lub coś powiązanego nie działa.

Wiem, że istnieje szansa na edycję samego dyskretnego pliku js lub nadpisanie go po stronie klienta. Chcę zmodyfikować komunikat o błędzie
data-val-number
tak samo, jak inne komunikaty po stronie serwera.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz zastąpić wiadomość, podając


Numer danych atrybut niezależnie podczas renderowania pola. To przedefiniuje domyślną wiadomość. Działa przynajmniej z MVC 4.

@ Html.EditorFor (model = & > model.MyNumberField, new {data_val_number = "wpisz liczbę całkowitą, koleś!"})

Pamiętaj, że musisz użyć podkreślenia w nazwie atrybutu do golenia, aby zaakceptować atrybut.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Musisz:
Dodaj następujący kod wewnątrz
Application_start ()
w Global.asax :
ClientDataTypeModelValidatorProvider.ResourceClassKey = "Messages";
DefaultModelBinder.ResourceClassKey = "Messages";

Kliknij prawym przyciskiem myszy projekt ASP.NET MVC w vs. Wybierz add = & > Dodaj folder ASP.NET = & GT; App_globalresources .
Dodaj plik
.resx
o nazwie
Messages.resx
do tego folderu.
Dodaj te zasoby łańcuchowe do pliku
.Resx
:
FieldMustBeDate The field {0} must be a date.
FieldMustBeNumeric The field {0} must be a number.
PropertyValueInvalid The value '{0}' is not valid for {1}.
PropertyValueRequired A value is required.

Zmień fieldmustbeneumeric więc jak chcesz ... :)
Jesteś skończony.
Sprawdź ten post, aby uzyskać więcej informacji:
Domyślnie lokalizację komunikatów o błędach w ASP.NET MVC i WebForms
http://weblogs.asp.net/imranba ... .aspx
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To nie będzie łatwe. Domyślna wiadomość jest przechowywana jako wbudowany zasób w
System.web.mvc
Montaż, a metoda pobrana jest prywatną metodą statyczną wewnętrznej klasy wewnętrznej (
System.Web. MVC.ClientdatATypemodelvalidatorProvider + NUMERICMODELVALIDATOR. MakeErrorsing
). To jakby facet z Microsoft, kodujący go, Hid Superselp :-)
Możesz spojrzeć na następujące

post na blogu
http://jwwishart.blogspot.com/ ... .html
który opisuje możliwe rozwiązanie. Zasadniczo musisz zastąpić istniejące

ClientDataTypeModelValidatorProvider
http://msdn.microsoft.com/en-u ... .aspx
na użytkowniku.
Jeśli nie lubisz kodowania na stałe, musisz to zrobić, możesz również zastąpić tę wartość całkowitą w swoim modelu widoku ciągiem i mieć niestandardowy atrybut walidacji, który przeanalizuje i wyświetli niestandardowy komunikat o błędzie (który może być nawet zlokalizowany) ...
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jako alternatywne obejście użyłem atrybutu RegularExpression, aby złapać nieprawidłowy wpis i ustawić tam moją wiadomość:
[RegularExpression(@"[0-9]*$", ErrorMessage = "Please enter a valid number ")]

Jest to trochę hacku, ale wydawało się, że zorientowanie złożoności innych rozwiązań przedstawionych przynajmniej w mojej szczególnej sytuacji.
Edytuj: Działał dobrze w MVC3, ale wydaje się, że mogą istnieć lepsze rozwiązania dla MVC4 +.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Z tej książki MVC 3, którą mam. Wszystko co musisz zrobić to:
public class ClientNumberValidatorProvider : ClientDataTypeModelValidatorProvider 
{
public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata,
ControllerContext context)
{
bool isNumericField = base.GetValidators(metadata, context).Any();
if (isNumericField)
yield return new ClientSideNumberValidator(metadata, context);
}
} public class ClientSideNumberValidator : ModelValidator
{
public ClientSideNumberValidator(ModelMetadata metadata,
ControllerContext controllerContext) : base(metadata, controllerContext) { } public override IEnumerable<ModelValidationResult> Validate(object container)
{
yield break;// Do nothing for server-side validation
} public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
yield return new ModelClientValidationRule {
ValidationType = "number",
ErrorMessage = string.Format(CultureInfo.CurrentCulture,
ValidationMessages.MustBeNumber,
Metadata.GetDisplayName())
};
}
} protected void Application_Start()
{
// Leave the rest of this method unchanged var existingProvider = ModelValidatorProviders.Providers
.Single(x => x is ClientDataTypeModelValidatorProvider);
ModelValidatorProviders.Providers.Remove(existingProvider);
ModelValidatorProviders.Providers.Add(new ClientNumberValidatorProvider());
}

Należy pamiętać, w jaki sposób otrzymuje się errormessage, określasz bieżącą kulturę, a zlokalizowana wiadomość jest usuwana z pliku zasobów walidacyjnej (pojawi się funkcje kultury) .resx. Jeśli tego nie potrzebujesz, po prostu zastąp go własną wiadomością.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Oto kolejne rozwiązanie, które zmienia stronę klienta wiadomości bez zmiany źródła MVC3. Pełna informacja w tym blogu:
https://greenicicle.wordpress. ... cript
https://greenicicle.wordpress. ... ript/
/
Krótko mówiąc, po załadowaniu jQuery validation plus należy dołączyć następujący skrypt

odpowiedni plik lokalizacyjny
https://github.com/jzaefferer/ ... ation
.
(function ($) {
// Walk through the adapters that connect unobstrusive validation to jQuery.validate.
// Look for all adapters that perform number validation
$.each($.validator.unobtrusive.adapters, function () {
if (this.name === "number") {
// Get the method called by the adapter, and replace it with one
// that changes the message to the jQuery.validate default message
// that can be globalized. If that string contains a {0} placeholder,
// it is replaced by the field name.
var baseAdapt = this.adapt;
this.adapt = function (options) {
var fieldName = new RegExp("The field (.+) must be a number").exec(options.message)[1];
options.message = $.validator.format($.validator.messages.number, fieldName);
baseAdapt(options);
};
}
});
} (jQuery));
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Można ustawić ResourceKey klasy ClientDataTypeModelValidatorProvider jako nazwę zasobu globalnego zawierającego klucz FieldMustBeNumeric, aby zastąpić komunikat o błędzie walidacji numeru MVC komunikatem niestandardowym. Kluczem komunikatu o błędzie walidacji daty jest również FieldMustBeDate.
ClientDataTypeModelValidatorProvider.ResourceKey="MyResources";// MyResource is my global resource
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Oto inne rozwiązanie w czystym js, które działa, jeśli chcesz określać komunikaty globalnie, a nie niestandardowe komunikaty dla każdego elementu.
Kluczem jest to, że sprawdzanie wiadomości są ustawiane przy użyciu
jQuery.validation.unobTrusive.js
Korzystając z atrybutu
Data-Val-XXX
dla każdego elementu, więc wszystko, co musisz zrobić Wymienione przez te wiadomości przed ich użyciem biblioteki, jest trochę brudny, ale chciałem szybko wykonać pracę szybko, więc chodzi o sprawdzenie rodzaju numeru:
$('[data-val-number]').each(function () {
var el = $(this);
var orig = el.data('val-number'); var fieldName = orig.replace('The field ', '');
fieldName = fieldName.replace(' must be a number.', ''); el.attr('data-val-number', fieldName + ' باید عددی باشد')
});

Dobrze jest, że nie wymaga kompilacji i możesz łatwo rozszerzyć go później, choć nie jest niezawodny, ale szybko.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Sprawdź też:
Kompletny przewodnik po walidacji w ASP.NET MVC 3 - część 2
http://www.devtrends.co.uk/blo ... art-2
Poniżej znajdują się główne części artykułu (kopiowane-wklejane).
Tworzenie w pełni funkcjonalnego walidatora pracującego zarówno na kliencie, jak i na serwerze składa się z czterech oddzielnych części. Najpierw jesteśmy
WalidacjaTattribute
i dodaj logikę skanowania serwera na stronie serwera. Następnie wdrażamy ICLientValidatable w naszym atrybucie, aby umożliwić atrybuty atrybutów HTML5 Client - * . Po trzecie, piszemy funkcję użytkownika JavaScript, który wykonuje skanowanie na kliencie. Wreszcie tworzymy adapter do konwersji atrybutów HTML5 do formatu, zrozumiałego przez naszą funkcję użytkownika. Chociaż brzmi to jak dużo pracy, gdy tylko zaczniesz, znajdziesz to stosunkowo proste.

Podklasy ValidationAttribute

W tym przykładzie napiszemy walidator NotEqualTo, który po prostu sprawdza, czy wartość jednej właściwości nie jest równa wartości innej.
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public sealed class NotEqualToAttribute : ValidationAttribute
{
private const string DefaultErrorMessage = "{0} cannot be the same as {1}."; public string OtherProperty { get; private set; } public NotEqualToAttribute(string otherProperty)
: base(DefaultErrorMessage)
{
if (string.IsNullOrEmpty(otherProperty))
{
throw new ArgumentNullException("otherProperty");
} OtherProperty = otherProperty;
} public override string FormatErrorMessage(string name)
{
return string.Format(ErrorMessageString, name, OtherProperty);
} protected override ValidationResult IsValid(object value,
ValidationContext validationContext)
{
if (value != null)
{
var otherProperty = validationContext.ObjectInstance.GetType()
.GetProperty(OtherProperty); var otherPropertyValue = otherProperty
.GetValue(validationContext.ObjectInstance, null); if (value.Equals(otherPropertyValue))
{
return new ValidationResult( FormatErrorMessage(validationContext.DisplayName));
}
}
return ValidationResult.Success;
}
}

Dodaj nowy atrybut do właściwości hasła RegisterModel i uruchom aplikację.
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
[NotEqualTo("UserName")]
public string Password { get; set; }...


Wdrożenie ICLientValidatable.

ASP.NET MVC 2 miał mechanizm dodawania walidacji po stronie klienta, ale nie był ładny. Na szczęście w MVC 3 sytuacja się poprawiła i proces jest teraz dość trywialny i na szczęście

nie

obejmuje zmianę
Global.asax
jak w poprzedniej wersji.
Pierwszym krokiem jest zaimplementowanie IClientValidatable przez niestandardowy atrybut walidacji. To jest prosty interfejs z jedną metodą:
public IEnumerable<ModelClientValidationRule> GetClientValidationRules( ModelMetadata metadata,
ControllerContext context)
{
var clientValidationRule = new ModelClientValidationRule()
{
ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
ValidationType = "notequalto"
}; clientValidationRule.ValidationParameters.Add("otherproperty", OtherProperty); return new[] { clientValidationRule };
}

Jeśli uruchomisz aplikację i zobaczysz źródło, zobaczysz, że wprowadzenie hasła HTML zawiera teraz nawigalto Atrybuty danych.
<div class="editor-field">
<input data-val="true" data-val-notequalto="Password cannot be the same as UserName."
data-val-notequalto-otherproperty="UserName"
data-val-regex="Weak password detected."
data-val-regex-pattern="^(?!password$)(?!12345$).*"
data-val-required="The Password field is required."
id="Password" name="Password" type="password"/>
<span class="hint">Enter your password here</span>
<span class="field-validation-valid" data-valmsg-for="Password"
data-valmsg-replace="true"></span>


Tworzenie funkcji użytkownika jQuery Sprawdź poprawność

Cały ten kod jest najlepiej umieszczony w osobnym pliku JavaScript.
(function ($) {
$.validator.addMethod("notequalto", function (value, element, params) {
if (!this.optional(element)) {
var otherProp = $('#' + params);
return (otherProp.val() !=
}
return true;
});$.validator.unobtrusive.adapters.addSingleVal("notequalto", "otherproperty");}(jQuery));

W zależności od wymagań dotyczących walidacji może się okazać, że biblioteka jquery.validate zawiera już kod wymagany do samej walidacji. W jquery.validate jest wiele walidatorów, które nie zostały zaimplementowane lub zmapowane do adnotacji danych, więc jeśli odpowiadają Twoim potrzebom, wszystko, co musisz napisać w javascript, to adapter lub nawet wywołanie adaptera wbudowanego, który może być po prostu w jednej linii. Zajrzyj do środka

jquery.validate.js

Aby dowiedzieć się, co tam jest.

Za pomocą istniejącego adaptera

jquery.validate.unobtrusive
Zadaniem adaptera jest odczytanie atrybutów HTML5
data- *
elementu formularza i przekonwertowanie tych danych do postaci zrozumiałej dla jquery.validate i niestandardowej funkcji walidacji. Jednak nie musisz wykonywać całej pracy samodzielnie, aw wielu przypadkach możesz wywołać adapter wbudowany. jquery.validate.unobtrusive deklaruje trzy wbudowane adaptery, których można używać w większości sytuacji. To:
jQuery.validator.unobtrusive.adapters.addBool - used when your validator does not need any additional data.
jQuery.validator.unobtrusive.adapters.addSingleVal - used when your validator takes in one piece of additional data.
jQuery.validator.unobtrusive.adapters.addMinMax - used when your validator deals with minimum and maximum values such as range or string length.

Jeśli Twój walidator nie pasuje do żadnej z tych kategorii, musisz napisać własny adapter za pomocą
jQuery.validator.unobtresive.adapters.add
Metoda. Nie jest tak trudny, jak się wydaje, i zobaczymy przykład później w tym artykule.
Używamy metody
addSingleVal
, przekazując nazwę adaptera i nazwę jedynej wartości, którą chcemy przekazać. Jeśli nazwa funkcji walidacji różni się od nazwy adaptera, możesz przekazać trzeci parametr (
ruleName
):
jQuery.validator.unobtrusive.adapters.addSingleVal("notequalto", "otherproperty", "mynotequaltofunction");

W tej chwili nasz zwyczaj został zakończony.
Aby uzyskać lepsze zrozumienie, zobacz

Sam artykuł
http://www.devtrends.co.uk/blo ... art-2
który zawiera bardziej szczegółowy opis i bardziej złożony przykład.
HTH.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Po prostu zrobiłem to, a następnie użyłem wyrażenia regularnego:
$(document).ready(function () {
$.validator.methods.number = function (e) {
return true;
};
});
[RegularExpression(@"^[0-9\.]*$", ErrorMessage = "Invalid Amount")]
public decimal? Amount { get; set; }
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Albo możesz to zrobić.
@Html.ValidationMessageFor(m => m.PercentChange, "Custom Message: Input value must be a number"), new { @style = "display:none" })

Mam nadzieję że to pomoże.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Robię to, stawiając go moim zdaniem
@Html.DropDownListFor(m => m.BenefNamePos, Model.Options, new { onchange = "changePosition(this);", @class="form-control", data_val_number = "This is my custom message" })
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Mam ten problem w Kendogridu, używam skryptu w końcu widoki na zastąpienie numeru danych:
@(Html.Kendo().Grid<Test.ViewModel>(Model)
.Name("listado")
...
.Columns(columns =>
{
columns.Bound("idElementColumn").Filterable(false);
...
}

I przynajmniej na końcu widoku umieściłem:
<script type="text/javascript">
$("#listado").on("click", function (e) {
$(".k-grid #idElementColumn").attr('data-val-number', 'Ingrese un número.');
});
</script>

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się