ASP.NET Core MVC ve sayfalarda Model doğrulaması Razor
Kirk Larkaya göre
bu makalede, ASP.NET Core MVC veya Pages uygulamasında kullanıcı girişinin nasıl doğrulanacağı açıklanır Razor .
Örnek kodu görüntüleyin veya indirin (nasıl indirilir).
Model durumu
Model durumu iki alt sistemden gelen hataları temsil eder: model bağlama ve model doğrulama. Model bağlamasından kaynaklanan hatalar genellikle veri dönüştürme hatalardır. Örneğin, bir tamsayı alanına bir "x" girilir. Model bağlama sonrasında model doğrulaması oluşur ve verilerin iş kurallarına uygun olmadığı rapor hataları raporlar. Örneğin, 1 ile 5 arasında bir derecelendirme bekleyen bir alana 0 girilir.
Hem model bağlama hem de model doğrulama, bir denetleyici eyleminin veya bir sayfa işleyici yönteminin yürütülmesinden önce oluşur Razor . Web uygulamaları için uygulama, ModelState.IsValid uygun şekilde inceleme ve tepki verme sorumluluğundadır. Web Apps genellikle sayfayı bir hata iletisiyle yeniden görüntülerdi:
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
_context.Movies.Add(Movie);
await _context.SaveChangesAsync();
return RedirectToPage("./Index");
}
Web API denetleyicilerinin ModelState.IsValid özniteliğe sahip olup olmadığını kontrol etmek zorunda değildir [ApiController] . Bu durumda, model durumu geçersiz olduğunda hata ayrıntılarını içeren bir otomatik HTTP 400 yanıtı döndürülür. Daha fazla bilgi için bkz. OTOMATIK HTTP 400 yanıtları.
Doğrulamayı yeniden çalıştır
Doğrulama otomatiktir, ancak el ile yinelemek isteyebilirsiniz. Örneğin, bir özellik için bir değer hesaplamanıza ve özelliği hesaplanan değere ayarladıktan sonra doğrulamayı yeniden çalıştırmak isteyebilirsiniz. Doğrulamayı yeniden çalıştırmak için, ModelStateDictionary.ClearValidationState Doğrulanmakta olan modele özgü doğrulamayı temizleme işlemini ve sonrasında şunu kullanın TryValidateModel :
public async Task<IActionResult> OnPostTryValidateAsync()
{
var modifiedReleaseDate = DateTime.Now.Date;
Movie.ReleaseDate = modifiedReleaseDate;
ModelState.ClearValidationState(nameof(Movie));
if (!TryValidateModel(Movie, nameof(Movie)))
{
return Page();
}
_context.Movies.Add(Movie);
await _context.SaveChangesAsync();
return RedirectToPage("./Index");
}
Doğrulama öznitelikleri
Doğrulama öznitelikleri, model özellikleri için doğrulama kuralları belirtmenize olanak tanır. Örnek uygulamadaki aşağıdaki örnek, doğrulama öznitelikleriyle açıklama eklenmiş bir model sınıfı gösterir. [ClassicMovie]Özniteliği özel bir doğrulama özniteliğidir ve diğerleri yerleşik olarak bulunur. Gösterilmez [ClassicMovieWithClientValidator] . [ClassicMovieWithClientValidator] özel bir öznitelik uygulamak için alternatif bir yol gösterir.
public class Movie
{
public int Id { get; set; }
[Required]
[StringLength(100)]
public string Title { get; set; }
[ClassicMovie(1960)]
[DataType(DataType.Date)]
[Display(Name = "Release Date")]
public DateTime ReleaseDate { get; set; }
[Required]
[StringLength(1000)]
public string Description { get; set; }
[Range(0, 999.99)]
public decimal Price { get; set; }
public Genre Genre { get; set; }
public bool Preorder { get; set; }
}
Yerleşik öznitelikler
Yerleşik doğrulama özniteliklerinden bazıları şunlardır:
[ValidateNever]: ValidateNeverAttribute Bir özelliğin veya parametrenin doğrulamadan dışlanacağını belirtir.[CreditCard]: Özelliğin kredi kartı biçimine sahip olduğunu doğrular. JQuery doğrulaması ek yöntemlerigerektirir.[Compare]: Bir modeldeki iki özelliği eşleştiğini doğrular.[EmailAddress]: Özelliğin bir e-posta biçimine sahip olduğunu doğrular.[Phone]: Özelliğin bir telefon numarası biçimine sahip olduğunu doğrular.[Range]: Özellik değerinin belirtilen bir aralık dahilinde olduğunu doğrular.[RegularExpression]: Özellik değerinin belirtilen bir normal ifadeyle eşleştiğini doğrular.[Required]: Alanın null olduğunu doğrular. Bu özniteliğin davranışı hakkındaki ayrıntılar için bkz.[Required]özniteliği .[StringLength]: Dize özellik değerinin belirtilen uzunluk sınırını aşmadığını doğrular.[Url]: Özelliğin bir URL biçimine sahip olduğunu doğrular.[Remote]: Sunucuda bir eylem yöntemi çağırarak istemcide girişi doğrular. Bu özniteliğin davranışı hakkındaki ayrıntılar için bkz.[Remote]özniteliği .
Doğrulama özniteliklerinin tüm listesi System. ComponentModel. Dataaçıklamalarda ad alanında bulunabilir.
Hata iletileri
Doğrulama öznitelikleri, geçersiz giriş için görüntülenecek hata iletisini belirtmenize izin verir. Örnek:
[StringLength(8, ErrorMessage = "Name length can't be more than 8.")]
Dahili olarak, öznitelikler, String.Format alan adı için bir yer tutucu ve bazen ek yer tutucular ile çağrı yapılır. Örnek:
[StringLength(8, ErrorMessage = "{0} length must be between {2} and {1}.", MinimumLength = 6)]
Bir Name özelliğe uygulandığında, yukarıdaki kod tarafından oluşturulan hata iletisi "ad uzunluğu 6 ile 8 arasında olmalıdır." olacaktır.
String.FormatBelirli bir özniteliğin hata iletisinde hangi parametrelerin geçtiğini öğrenmek için, bkz. dataaçıklamalarda kaynak kodu.
Null değer atanamaz başvuru türleri ve [Required] özniteliği
Doğrulama sistemi, null olamayan parametrelere veya sınırlı özelliklere bir özniteliğe sahip gibi davranır [Required(AllowEmptyStrings = true)] . Nullable Bağlamların etkinleştirilmesisayesinde, MVC örtük olarak null yapılamayan özellikleri veya parametreleri özniteliğiyle ilişkilendiriledikleri gibi doğrulamaya başlar [Required(AllowEmptyStrings = true)] . Aşağıdaki kodu inceleyin:
public class Person
{
public string Name { get; set; }
}
Uygulama ile oluşturulduysa <Nullable>enable</Nullable> Name JSON veya form gönderimiyle ilgili eksik bir değer bir doğrulama hatasına neden olur. Özellik için null veya eksik değerlerin belirtilmesine izin vermek üzere null yapılabilir bir başvuru türü kullanın Name :
public class Person
{
public string? Name { get; set; }
}
Bu davranış, içinde yapılandırılarak devre dışı SuppressImplicitRequiredAttributeForNonNullableReferenceTypes bırakılabilir Startup.ConfigureServices :
services.AddControllers(options => options.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true);
[Zorunlu] sunucuda doğrulama
Sunucuda, özelliği null ise gerekli bir değer eksik olarak kabul edilir. Null yapılamayan bir alan her zaman geçerlidir ve [Required] özniteliğin hata mesajı hiçbir zaman gösterilmez.
Ancak, null olamayan bir özellik için model bağlama başarısız olabilir ve gibi bir hata mesajı elde edilir The value '' is invalid . Null yapılamayan türlerin sunucu tarafı doğrulaması için özel bir hata iletisi belirtmek üzere aşağıdaki seçenekleriniz vardır:
Alanı null yapılabilir yapın (örneğin,
decimal?yerinedecimal). Null <T> yapılabilir değer türleri standart null yapılabilir türler gibi değerlendirilir.Aşağıdaki örnekte gösterildiği gibi model bağlama tarafından kullanılacak varsayılan hata iletisini belirtin:
services.AddRazorPages() .AddMvcOptions(options => { options.MaxModelValidationErrors = 50; options.ModelBindingMessageProvider.SetValueMustNotBeNullAccessor( _ => "The field is required."); }); services.AddSingleton<IValidationAttributeAdapterProvider, CustomValidationAttributeAdapterProvider>();İçin varsayılan iletileri ayarlayabileceğiniz model bağlama hataları hakkında daha fazla bilgi için bkz DefaultModelBindingMessageProvider ..
[Zorunlu] istemcide doğrulama
Null yapılamayan türler ve dizeler, sunucu ile karşılaştırıldığında, istemci üzerinde farklı şekilde işlenir. İstemcide:
- Yalnızca girdi girildiğinde bir değer vardır. Bu nedenle, istemci tarafı doğrulaması null yapılamayan türler, null yapılabilir türler ile aynı şekilde işler.
- Bir dize alanındaki boşluk, jQuery doğrulaması gerekli yöntemi tarafından geçerli bir girdi olarak kabul edilir. Yalnızca boşluk girildiğinde, sunucu tarafı doğrulaması gerekli bir dize alanını geçersiz kabul eder.
Daha önce belirtildiği gibi, null olamayan türler bir özniteliğe sahip olsa da kabul edilir [Required(AllowEmptyStrings = true)] . Bu, özniteliğini uygulamasanız bile istemci tarafı doğrulamayı alacağınız anlamına gelir [Required(AllowEmptyStrings = true)] . Ancak özniteliğini kullanmazsanız varsayılan bir hata iletisi alırsınız. Özel bir hata iletisi belirtmek için özniteliğini kullanın.
[Uzak] özniteliği
[Remote]Özniteliği, alan girişinin geçerli olup olmadığını anlamak için sunucu üzerinde bir yöntem çağrılmasını gerektiren istemci tarafı doğrulaması uygular. Örneğin, uygulamanın bir kullanıcı adının zaten kullanımda olup olmadığını doğrulaması gerekebilir.
Uzaktan doğrulamayı uygulamak için:
JavaScript 'e çağırmak için bir eylem yöntemi oluşturun. JQuery doğrulaması uzak YÖNTEMI bir JSON yanıtı bekliyor:
truegiriş verilerinin geçerli olduğu anlamına gelir.false,undefinedya danullgirişin geçersiz olduğu anlamına gelir. Varsayılan hata iletisini görüntüler.- Diğer herhangi bir dize, girişin geçersiz olduğu anlamına gelir. Dizeyi özel bir hata iletisi olarak görüntüleyin.
Özel bir hata iletisi döndüren eylem yöntemine bir örnek aşağıda verilmiştir:
[AcceptVerbs("GET", "POST")] public IActionResult VerifyEmail(string email) { if (!_userService.VerifyEmail(email)) { return Json($"Email {email} is already in use."); } return Json(true); }Model sınıfında,
[Remote]Aşağıdaki örnekte gösterildiği gibi, doğrulama eylemi yöntemine işaret eden bir özniteliğe sahip özelliğe açıklama ekleyin:[Remote(action: "VerifyEmail", controller: "Users")] public string Email { get; set; }[Remote]ÖzniteliğiMicrosoft.AspNetCore.Mvcad alanıdır.
Ek alanlar
AdditionalFieldsÖzniteliğinin özelliği, [Remote] sunucudaki verilere karşı alan birleşimlerini doğrulamanızı sağlar. Örneğin, User model FirstName ve LastName özellikleri varsa, var olan hiçbir kullanıcının bu ad çiftine sahip olmadığını doğrulamak isteyebilirsiniz. Aşağıdaki örnek nasıl kullanılacağını gösterir AdditionalFields :
[Remote(action: "VerifyName", controller: "Users", AdditionalFields = nameof(LastName))]
[Display(Name = "First Name")]
public string FirstName { get; set; }
[Remote(action: "VerifyName", controller: "Users", AdditionalFields = nameof(FirstName))]
[Display(Name = "Last Name")]
public string LastName { get; set; }
AdditionalFields açıkça "FirstName" ve "LastName" dizelerine ayarlanabilir, ancak NameOf işlecinin kullanılması daha sonra yeniden düzenlemeyi basitleştirir. Bu doğrulamanın eylem yöntemi hem hem de firstName lastName bağımsız değişkenlerini kabul etmelidir:
[AcceptVerbs("GET", "POST")]
public IActionResult VerifyName(string firstName, string lastName)
{
if (!_userService.VerifyName(firstName, lastName))
{
return Json($"A user named {firstName} {lastName} already exists.");
}
return Json(true);
}
Kullanıcı adı veya soyadı girdiğinde JavaScript, bu ad çiftinin alındığını görmek için uzak bir çağrı yapar.
İki veya daha fazla ek alanı doğrulamak için bunları virgülle ayrılmış bir liste olarak belirtin. Örneğin, modele bir özellik eklemek için MiddleName [Remote] Aşağıdaki örnekte gösterildiği gibi özniteliği ayarlayın:
[Remote(action: "VerifyName", controller: "Users", AdditionalFields = nameof(FirstName) + "," + nameof(LastName))]
public string MiddleName { get; set; }
AdditionalFieldsTüm öznitelik bağımsız değişkenleri gibi, sabit bir ifade olmalıdır. Bu nedenle, bir ara değerli dize veya Join başlatmak için çağrı kullanmayın AdditionalFields .
Yerleşik özniteliklerin alternatifleri
Yerleşik öznitelikler tarafından sağlanmayan doğrulamaya ihtiyacınız varsa şunları yapabilirsiniz:
Özel öznitelikler
Yerleşik doğrulama özniteliklerinin işlemeyen senaryolar için özel doğrulama öznitelikleri oluşturabilirsiniz. Öğesinden devralan bir sınıf oluşturun ValidationAttribute ve yöntemi geçersiz kılın IsValid .
IsValidYöntemi, doğrulanacak girdi olan Value adlı bir nesne kabul eder. Aşırı yükleme, ValidationContext model bağlama tarafından oluşturulan model örneği gibi ek bilgiler sağlayan bir nesneyi de kabul eder.
Aşağıdaki örnek, Klasik tarz bir filmin yayın tarihinin belirtilen yıldan daha sonra olmadığını doğrular. [ClassicMovie]Öznitelik:
- Yalnızca sunucuda çalışır.
- Klasik Filmler için, yayımlanma tarihini doğrular:
public class ClassicMovieAttribute : ValidationAttribute
{
public ClassicMovieAttribute(int year)
{
Year = year;
}
public int Year { get; }
public string GetErrorMessage() =>
$"Classic movies must have a release year no later than {Year}.";
protected override ValidationResult IsValid(object value,
ValidationContext validationContext)
{
var movie = (Movie)validationContext.ObjectInstance;
var releaseYear = ((DateTime)value).Year;
if (movie.Genre == Genre.Classic && releaseYear > Year)
{
return new ValidationResult(GetErrorMessage());
}
return ValidationResult.Success;
}
}
movieYukarıdaki örnekteki değişken, Movie form gönderiminde verileri içeren bir nesneyi temsil eder. Doğrulama başarısız olduğunda, bir ValidationResult hata iletisi döndürür.
IValidatableObject
Yukarıdaki örnek yalnızca türlerle birlikte kullanılabilir Movie . Aşağıdaki örnekte gösterildiği gibi, sınıf düzeyi doğrulama için başka bir seçenek de IValidatableObject model sınıfında uygulanır:
public class ValidatableMovie : IValidatableObject
{
private const int _classicYear = 1960;
public int Id { get; set; }
[Required]
[StringLength(100)]
public string Title { get; set; }
[DataType(DataType.Date)]
[Display(Name = "Release Date")]
public DateTime ReleaseDate { get; set; }
[Required]
[StringLength(1000)]
public string Description { get; set; }
[Range(0, 999.99)]
public decimal Price { get; set; }
public Genre Genre { get; set; }
public bool Preorder { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (Genre == Genre.Classic && ReleaseDate.Year > _classicYear)
{
yield return new ValidationResult(
$"Classic movies must have a release year no later than {_classicYear}.",
new[] { nameof(ReleaseDate) });
}
}
}
Üst düzey düğüm doğrulaması
Üst düzey düğümler şunları içerir:
- Eylem parametreleri
- Denetleyici özellikleri
- Sayfa işleyici parametreleri
- Sayfa modeli özellikleri
Model bağlantılı üst düzey düğümler, model özelliklerini doğrulamaya ek olarak onaylanır. Örnek uygulamadan aşağıdaki örnekte, VerifyPhone yöntemi RegularExpressionAttribute eylem parametresini doğrulamak için öğesini kullanır phone :
[AcceptVerbs("GET", "POST")]
public IActionResult VerifyPhone(
[RegularExpression(@"^\d{3}-\d{3}-\d{4}$")] string phone)
{
if (!ModelState.IsValid)
{
return Json($"Phone {phone} has an invalid format. Format: ###-###-####");
}
return Json(true);
}
En üst düzey düğümler, BindRequiredAttribute doğrulama öznitelikleriyle birlikte kullanılabilir. Örnek uygulamadaki aşağıdaki örnekte, CheckAge yöntemi, age form gönderildiğinde parametrenin sorgu dizesinden bağlanması gerektiğini belirtir:
[HttpPost]
public IActionResult CheckAge([BindRequired, FromQuery] int age)
{
Denetim yaşı sayfasında (Checkage. cshtml) iki form vardır. İlk form Age 99 bir değeri sorgu dizesi parametresi olarak gönderir: https://localhost:5001/Users/CheckAge?Age=99 .
Sorgu dizesinden düzgün şekilde biçimlendirilen bir age parametre gönderildiğinde, form doğrular.
Denetim yaşı sayfasındaki ikinci form, Age isteğin gövdesindeki değeri gönderir ve doğrulama başarısız olur. ageParametre bir sorgu dizesinden gelmesi gerektiğinden bağlama başarısız olur.
En fazla hata sayısı
En fazla hata sayısına ulaşıldığında doğrulama durduruluyor (varsayılan olarak 200). Bu numarayı içinde aşağıdaki kodla yapılandırabilirsiniz Startup.ConfigureServices :
services.AddRazorPages()
.AddMvcOptions(options =>
{
options.MaxModelValidationErrors = 50;
options.ModelBindingMessageProvider.SetValueMustNotBeNullAccessor(
_ => "The field is required.");
});
services.AddSingleton<IValidationAttributeAdapterProvider,
CustomValidationAttributeAdapterProvider>();
En yüksek özyineleme
ValidationVisitor doğrulanan modelin nesne grafiğinin gezgeçer. Derin olan veya sonsuz özyinelemeli olan modeller için doğrulama, yığın taşmasına neden olabilir. Mvcoptions. MaxValidationDepth , ziyaretçi özyineleme yapılandırılmış bir derinliği aşarsa doğrulamanın erken durdurulması için bir yol sağlar. Varsayılan değeri 32 ' MvcOptions.MaxValidationDepth dir.
Otomatik kısa devre
Model grafı doğrulama gerektirmiyorsa, doğrulama otomatik olarak kısa devre dışı (atlandı). Çalışma zamanının, hiçbir doğrulayıcıya sahip olmayan temel elemanlar koleksiyonları ( byte[] , string[] ,,,, ve gibi) için doğrulamayı atlayan nesneler Dictionary<string, string> .
İstemci tarafı doğrulaması
İstemci tarafı doğrulama, form geçerli olana kadar gönderimi önler. Gönder düğmesi, formu gönderen veya hata iletilerini görüntüleyen JavaScript 'ı çalıştırır.
Bir form üzerinde giriş hataları olduğunda, istemci tarafı doğrulaması sunucuya gereksiz gidiş dönüş önler. _Layout. cshtml ve _ValidationScriptsPartial. cshtml ' deki aşağıdaki betik başvuruları istemci tarafı doğrulamayı destekler:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.1/jquery.validate.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.min.js"></script>
JQuery unobtrusive doğrulama betiği, popüler jQuery doğrulama eklentisi üzerinde derleme yapan özel bir Microsoft ön uç kitaplığıdır. JQuery unobtrusive doğrulaması olmadan, iki yerde aynı doğrulama mantığını kodlamakta olmanız gerekir: model özelliklerindeki Sunucu tarafı doğrulama özniteliklerinde bir kez ve sonra istemci tarafı betiklerimizde. Bunun yerine, Etiket Yardımcıları ve HTML Yardımcıları , doğrulama data- gerektiren form öğeleri için HTML 5 özniteliklerini işlemek üzere model özelliklerinden doğrulama özniteliklerini ve tür meta verilerini kullanır. jQuery unobtrusive doğrulaması öznitelikleri ayrıştırır data- ve mantığı jQuery doğrulamasına geçirir ve sunucu tarafı doğrulama mantığını istemciye etkin bir şekilde "kopyalıyor". Aşağıda gösterildiği gibi, etiket yardımcıları kullanarak istemcisinde doğrulama hatalarını görüntüleyebilirsiniz:
<div class="form-group">
<label asp-for="Movie.ReleaseDate" class="control-label"></label>
<input asp-for="Movie.ReleaseDate" class="form-control" />
<span asp-validation-for="Movie.ReleaseDate" class="text-danger"></span>
</div>
Önceki etiket yardımcıları aşağıdaki HTML 'yi işler:
<div class="form-group">
<label class="control-label" for="Movie_ReleaseDate">Release Date</label>
<input class="form-control" type="date" data-val="true"
data-val-required="The Release Date field is required."
id="Movie_ReleaseDate" name="Movie.ReleaseDate" value="">
<span class="text-danger field-validation-valid"
data-valmsg-for="Movie.ReleaseDate" data-valmsg-replace="true"></span>
</div>
data-HTML çıkışındaki özniteliklerin, özelliği için doğrulama özniteliklerine karşılık geldiğini unutmayın Movie.ReleaseDate . data-val-requiredÖznitelik, Kullanıcı Yayın tarihi alanını doldurmazsa, görüntülenecek bir hata iletisi içerir. jQuery unobtrusive doğrulaması bu değeri jQuery doğrulaması Required () yöntemine geçirir ve sonra bu iletiyi eşlik eden <span> öğede görüntüler.
Veri türü doğrulama, bir öznitelik tarafından geçersiz kılınmadığı müddetçe, özelliğin .NET türünü temel alır [DataType] . Tarayıcıların kendi varsayılan hata iletileri vardır ancak jQuery doğrulaması unobtrusive doğrulama paketi bu iletileri geçersiz kılabilir. [DataType] gibi öznitelikler ve alt sınıflar [EmailAddress] , hata iletisini belirtmenize izin verir.
Unobtrusive doğrulaması
engellemeyen doğrulama hakkında daha fazla bilgi için bu GitHub sorunabakın.
Dinamik formlara doğrulama ekleme
jQuery unobtrusive doğrulaması, sayfa ilk kez yüklendiğinde, jQuery doğrulamasına yönelik doğrulama mantığını ve parametreleri geçirir. Bu nedenle, doğrulama dinamik olarak üretilen formlarda otomatik olarak çalışmaz. Doğrulamayı etkinleştirmek için, jQuery 'ten kaçınmaya yönelik doğrulamayı, dinamik formu oluşturduktan hemen sonra ayrıştırmaya söyleyin. Örneğin, aşağıdaki kod, AJAX aracılığıyla eklenen bir formda istemci tarafı doğrulamayı ayarlar.
$.get({
url: "https://url/that/returns/a/form",
dataType: "html",
error: function(jqXHR, textStatus, errorThrown) {
alert(textStatus + ": Couldn't add form. " + errorThrown);
},
success: function(newFormHTML) {
var container = document.getElementById("form-container");
container.insertAdjacentHTML("beforeend", newFormHTML);
var forms = container.getElementsByTagName("form");
var newForm = forms[forms.length - 1];
$.validator.unobtrusive.parse(newForm);
}
})
$.validator.unobtrusive.parse()Yöntemi, bir bağımsız değişkeni olarak bir jQuery seçiciyi kabul eder. Bu yöntem, jQuery 'in bu data- seçicideki formların özniteliklerini ayrıştırmasına izin vermez. Daha sonra bu özniteliklerin değerleri jQuery doğrulama eklentisine geçirilir.
Dinamik denetimlere doğrulama ekleme
$.validator.unobtrusive.parse()Yöntemi, ve gibi dinamik olarak üretilen denetimlerde değil, formun tamamında işe yarar <input> <select/> . Formu yeniden oluşturmak için, aşağıdaki örnekte gösterildiği gibi, form daha önce ayrıştırıldığında eklenen doğrulama verilerini kaldırın:
$.get({
url: "https://url/that/returns/a/control",
dataType: "html",
error: function(jqXHR, textStatus, errorThrown) {
alert(textStatus + ": Couldn't add control. " + errorThrown);
},
success: function(newInputHTML) {
var form = document.getElementById("my-form");
form.insertAdjacentHTML("beforeend", newInputHTML);
$(form).removeData("validator") // Added by jQuery Validation
.removeData("unobtrusiveValidation"); // Added by jQuery Unobtrusive Validation
$.validator.unobtrusive.parse(form);
}
})
Özel istemci tarafı doğrulaması
Özel istemci tarafı doğrulaması, data- özel bir jQuery doğrulama bağdaştırıcısıyla çalışan HTML öznitelikleri oluşturarak yapılır. Aşağıdaki örnek bağdaştırıcı kodu, [ClassicMovie] [ClassicMovieWithClientValidator] Bu makalede daha önce sunulan ve öznitelikleri için yazılmıştır:
$.validator.addMethod('classicmovie', function (value, element, params) {
var genre = $(params[0]).val(), year = params[1], date = new Date(value);
// The Classic genre has a value of '0'.
if (genre && genre.length > 0 && genre[0] === '0') {
// The release date for a Classic is valid if it's no greater than the given year.
return date.getUTCFullYear() <= year;
}
return true;
});
$.validator.unobtrusive.adapters.add('classicmovie', ['year'], function (options) {
var element = $(options.form).find('select#Movie_Genre')[0];
options.rules['classicmovie'] = [element, parseInt(options.params['year'])];
options.messages['classicmovie'] = options.message;
});
Bağdaştırıcıların nasıl yazılacağı hakkında daha fazla bilgi için jQuery doğrulama belgelerinebakın.
Belirli bir alan için bir bağdaştırıcının kullanımı, şu öznitelikler tarafından tetiklenir data- :
- Alana, doğrulamaya () tabi olacak şekilde bayrak ekleyin
data-val="true". - Bir doğrulama kuralı adı ve hata iletisi metni (örneğin,) belirler
data-val-rulename="Error message.". - Doğrulayıcı ihtiyaçlarına ek parametreler sağlayın (örneğin,
data-val-rulename-param1="value").
Aşağıdaki örnek, data- örnek uygulamanın özniteliği için öznitelikleri gösterir ClassicMovie :
<input class="form-control" type="date"
data-val="true"
data-val-classicmovie="Classic movies must have a release year no later than 1960."
data-val-classicmovie-year="1960"
data-val-required="The Release Date field is required."
id="Movie_ReleaseDate" name="Movie.ReleaseDate" value="">
Daha önce belirtildiği gibi, Etiket Yardımcıları ve HTML Yardımcıları , öznitelikleri işlemek için doğrulama özniteliklerinden bilgileri kullanır data- . Özel HTML özniteliklerinin oluşturulmasına neden olan kod yazmak için iki seçenek vardır data- :
- Öğesinden türeten bir sınıf oluşturun ve
AttributeAdapterBase<TAttribute>IValidationAttributeAdapterProviderözniteliği ve kendı bağdaştırıcısını dı olarak kaydedin. Bu yöntem, sunucu ile ilgili ve istemciyle ilgili doğrulama kodundaki tek sorumluluk sorumlusunu , ayrı sınıflarda izler. Ayrıca bağdaştırıcı, DI ' de kaydolduğundan bu yana de bunun avantajına sahiptir. IClientModelValidatorValidationAttributeSınıfınıza uygulayın. Bu yöntem, öznitelik herhangi bir sunucu tarafı doğrulaması yapamazsa ve hiçbir hizmete gerek duymazsa uygun olabilir.
İstemci tarafı doğrulaması için AttributeAdapter
data-HTML 'de öznitelikleri işleme yöntemi ClassicMovie örnek uygulamadaki özniteliği tarafından kullanılır. Bu yöntemi kullanarak istemci doğrulaması eklemek için:
Özel doğrulama özniteliği için bir öznitelik bağdaştırıcı sınıfı oluşturun. Sınıfından türet AttributeAdapterBase<TAttribute> .
AddValidationdata-Aşağıdaki örnekte gösterildiği gibi, işlenen çıktıya öznitelikler ekleyen bir yöntem oluşturun:public class ClassicMovieAttributeAdapter : AttributeAdapterBase<ClassicMovieAttribute> { public ClassicMovieAttributeAdapter(ClassicMovieAttribute attribute, IStringLocalizer stringLocalizer) : base(attribute, stringLocalizer) { } public override void AddValidation(ClientModelValidationContext context) { MergeAttribute(context.Attributes, "data-val", "true"); MergeAttribute(context.Attributes, "data-val-classicmovie", GetErrorMessage(context)); var year = Attribute.Year.ToString(CultureInfo.InvariantCulture); MergeAttribute(context.Attributes, "data-val-classicmovie-year", year); } public override string GetErrorMessage(ModelValidationContextBase validationContext) => Attribute.GetErrorMessage(); }uygulayan bir bağdaştırıcı sağlayıcı sınıfı IValidationAttributeAdapterProvider oluşturun. yönteminde, bu örnekte gösterildiği gibi özel özniteliği
GetAttributeAdapterbağdaştırıcının oluşturucus una iletir:public class CustomValidationAttributeAdapterProvider : IValidationAttributeAdapterProvider { private readonly IValidationAttributeAdapterProvider baseProvider = new ValidationAttributeAdapterProvider(); public IAttributeAdapter GetAttributeAdapter(ValidationAttribute attribute, IStringLocalizer stringLocalizer) { if (attribute is ClassicMovieAttribute classicMovieAttribute) { return new ClassicMovieAttributeAdapter(classicMovieAttribute, stringLocalizer); } return baseProvider.GetAttributeAdapter(attribute, stringLocalizer); } }IÇINDE DI için bağdaştırıcı sağlayıcısını
Startup.ConfigureServiceskaydetme:services.AddRazorPages() .AddMvcOptions(options => { options.MaxModelValidationErrors = 50; options.ModelBindingMessageProvider.SetValueMustNotBeNullAccessor( _ => "The field is required."); }); services.AddSingleton<IValidationAttributeAdapterProvider, CustomValidationAttributeAdapterProvider>();
İstemci tarafı doğrulama için IClientModelValidator
HTML'de data- öznitelikleri işlemenin bu yöntemi, örnek ClassicMovieWithClientValidator uygulamanın özniteliği tarafından kullanılır. Bu yöntemi kullanarak istemci doğrulaması eklemek için:
Özel doğrulama özniteliğinde arabirimini
IClientModelValidatoruygulayarak bir yöntemAddValidationoluşturun.AddValidationyönteminde, aşağıdaki örnekte gösterildiği gibi doğrulama içindata-öznitelikler ekleyin:public class ClassicMovieWithClientValidatorAttribute : ValidationAttribute, IClientModelValidator { public ClassicMovieWithClientValidatorAttribute(int year) { Year = year; } public int Year { get; } public void AddValidation(ClientModelValidationContext context) { MergeAttribute(context.Attributes, "data-val", "true"); MergeAttribute(context.Attributes, "data-val-classicmovie", GetErrorMessage()); var year = Year.ToString(CultureInfo.InvariantCulture); MergeAttribute(context.Attributes, "data-val-classicmovie-year", year); } public string GetErrorMessage() => $"Classic movies must have a release year no later than {Year}."; protected override ValidationResult IsValid(object value, ValidationContext validationContext) { var movie = (Movie)validationContext.ObjectInstance; var releaseYear = ((DateTime)value).Year; if (movie.Genre == Genre.Classic && releaseYear > Year) { return new ValidationResult(GetErrorMessage()); } return ValidationResult.Success; } private bool MergeAttribute(IDictionary<string, string> attributes, string key, string value) { if (attributes.ContainsKey(key)) { return false; } attributes.Add(key, value); return true; } }
İstemci tarafı doğrulamayı devre dışı bırakma
Aşağıdaki kod, Sayfalar'da istemci doğrulamasını devre dışı Razor bıraktır:
services.AddRazorPages()
.AddViewOptions(options =>
{
options.HtmlHelperOptions.ClientValidationEnabled = false;
});
İstemci tarafı doğrulamayı devre dışı bırakmak için diğer seçenekler:
- Tüm
_ValidationScriptsPartial.cshtml dosyalarında başvurusuna açıklama olarak bakın. - _ Pages\Shared ValidationScriptsPartial.cshtml dosyasının içeriğini kaldırın.
Yukarıdaki yaklaşım, Sınıf Kitaplığı'nın istemci tarafı ASP.NET Core Identity Razor doğrulamasını engellemez. Daha fazla bilgi için bkz. ASP.NET Core projelerinde yapı iskelesi Identity.
Ek kaynaklar
Bu makalede, bir MVC veya Sayfalar uygulamasında ASP.NET Core girişini doğrulama Razor açıklanmıştır.
Örnek kodu görüntüleme veya indirme (indirme).
Model durumu
Model durumu, iki alt sistemden gelen hataları temsil eder: model bağlama ve model doğrulama. Model bağlamadan kaynaklanan hatalar genellikle veri dönüştürme hatalarıdır (örneğin, tamsayıyı bekler bir alana "x" girilir). Model doğrulaması, model bağlamadan sonra gerçekleşir ve verilerin iş kurallarına uymayan hataları raporlar (örneğin, 1 ile 5 arasında bir derecelendirme bekliyor bir alana 0 girilir).
Hem model bağlama hem de doğrulama, denetleyici eylemi veya Sayfalar işleyicisi yöntemi Razor yürütmeden önce gerçekleşir. Web uygulamaları için, uygun şekilde inceleme ve tepki verme ModelState.IsValid uygulamanın sorumluluğundadır. Web uygulamaları genellikle sayfayı bir hata iletisiyle yeniden oynatmak için:
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
_context.Movie.Add(Movie);
await _context.SaveChangesAsync();
return RedirectToPage("./Index");
}
Web API'si denetleyicilerinin özniteliğine sahip ModelState.IsValid olup olmadığını denetlemesi [ApiController] gerekir. Bu durumda, model durumu geçersiz olduğunda hata ayrıntılarını içeren otomatik bir HTTP 400 yanıtı döndürülür. Daha fazla bilgi için bkz. Otomatik HTTP 400 yanıtları.
Doğrulamayı yeniden çalıştırma
Doğrulama otomatiktir, ancak el ile yineleyebilirsiniz. Örneğin, bir özellik için bir değer hesaplar ve özelliği hesaplanan değere ayardikten sonra doğrulamayı yeniden çalıştırmayı istiyor olabilirsiniz. Doğrulamayı yeniden çalıştırma için burada TryValidateModel gösterildiği gibi yöntemini arayın:
var movie = new Movie
{
Title = title,
Genre = genre,
ReleaseDate = modifiedReleaseDate,
Description = description,
Price = price,
Preorder = preorder,
};
TryValidateModel(movie);
if (ModelState.IsValid)
{
_context.AddMovie(movie);
_context.SaveChanges();
return RedirectToAction(actionName: nameof(Index));
}
return View(movie);
Doğrulama öznitelikleri
Doğrulama öznitelikleri, model özellikleri için doğrulama kuralları belirtmenize izin verir. Örnek uygulamanın aşağıdaki örneği, doğrulama öznitelikleriyle açıklama ek açıklamalı bir model sınıfını gösterir. özniteliği [ClassicMovie] özel bir doğrulama özniteliğidir ve diğerleri yerleşiktir. Özel öznitelik [ClassicMovie2] uygulamanın alternatif bir yolunu gösteren gösterilmez.
public class Movie
{
public int Id { get; set; }
[Required]
[StringLength(100)]
public string Title { get; set; }
[ClassicMovie(1960)]
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
[Required]
[StringLength(1000)]
public string Description { get; set; }
[Range(0, 999.99)]
public decimal Price { get; set; }
[Required]
public Genre Genre { get; set; }
public bool Preorder { get; set; }
}
Yerleşik öznitelikler
Yerleşik doğrulama öznitelikleri şunlardır:
[CreditCard]: Özelliğin kredi kartı biçimine sahip olduğunu doğrular.[Compare]: Modelde iki özelliğin eş olduğunu doğrular. Örneğin, Register.cshtml.cs dosyası girilen iki[Compare]parolanın eş olduğunu doğrulamak için kullanır. İskele Identity yazma kodunu görmek için.[EmailAddress]: Özelliğin bir e-posta biçimine sahip olduğunu doğrular.[Phone]: Özelliğin telefon numarası biçimine sahip olduğunu doğrular.[Range]: Özellik değerinin belirtilen bir aralık içinde olduğunu doğrular.[RegularExpression]: Özellik değerinin belirtilen bir normal ifadeyle eş olduğunu doğrular.[Required]: Alanın null olmadığını doğrular. Bu[Required]özniteliğin davranışıyla ilgili ayrıntılar için özniteliğine bakın.[StringLength]: Bir dize özellik değerinin belirtilen uzunluk sınırını aşmadan önce olduğunu doğrular.[Url]: Özelliğin URL biçimine sahip olduğunu doğrular.[Remote]: Sunucu üzerinde bir eylem yöntemini çağırarak istemcide girişi doğrular. Bu[Remote]özniteliğin davranışıyla ilgili ayrıntılar için özniteliğine bakın.
özniteliğini [RegularExpression] istemci tarafı doğrulama ile kullanırken, regex istemcide JavaScript'te yürütülür. Bu, ECMAScript eşleştirme davranışının kullan anlamına gelir. Daha fazla bilgi için bu soruna GitHub bakın.
Doğrulama özniteliklerinin tam listesi System.ComponentModel.DataAnnotations ad alanı içinde bulunabilir.
Hata iletileri
Doğrulama öznitelikleri, geçersiz giriş için görüntülenecek hata iletisini belirtmenize izin verir. Örnek:
[StringLength(8, ErrorMessage = "Name length can't be more than 8.")]
Dahili olarak, öznitelikler alan String.Format adı için bir yer tutucu ve bazen ek yer tutucular ile çağrır. Örnek:
[StringLength(8, ErrorMessage = "{0} length must be between {2} and {1}.", MinimumLength = 6)]
Bir özele uygulandığında, önceki kod tarafından oluşturulan hata iletisi "Ad uzunluğu 6 ile Name 8 arasında olmalıdır." olur.
Belirli bir özniteliğin hata iletisi için hangi parametrelerin geçirilmek üzere olduğunu bulmak için String.Format DataAnnotations kaynak koduna bakın.
[Gerekli] özniteliği
Varsayılan olarak, doğrulama sistemi null değer atılamaz parametreleri veya özellikleri bir özniteliğine sahip gibi [Required(AllowEmptyStrings = true)] davranır. ve gibi değer decimal türleri null int değere sahip değildir.
Sunucuda [Gerekli] doğrulama
Sunucuda, özellik null ise gerekli bir değer eksik olarak kabul edilir. Null değere sahip olmayan bir alan her zaman geçerlidir ve [Required] özniteliğinin hata iletisi hiçbir zaman görüntülenmez.
Ancak, null değere sahip olmayan bir özellik için model bağlama başarısız olabilir ve bu da gibi bir hata iletisiyle The value '' is invalid sonuçlanabilir. Null değere sahip olmayan türlerin sunucu tarafı doğrulaması için özel bir hata iletisi belirtmek için aşağıdaki seçenekleriniz vardır:
Alanı null değere değiştirilebilir hale (örneğin,
decimal?decimalyerine). Null <T> değere değiştirilebilir değer türleri standart null değere sahip türler gibi kabul edilir.Aşağıdaki örnekte gösterildiği gibi model bağlaması tarafından kullanılacak varsayılan hata iletisini belirtin:
services.AddMvc(options => { options.MaxModelValidationErrors = 50; options.ModelBindingMessageProvider.SetValueMustNotBeNullAccessor( (_) => "The field is required."); }) .SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddSingleton <IValidationAttributeAdapterProvider, CustomValidationAttributeAdapterProvider>();Varsayılan iletileri ayarlayabilirsiniz model bağlama hataları hakkında daha fazla bilgi için, bkz. DefaultModelBindingMessageProvider .
İstemcide [Gerekli] doğrulama
Null değere sahip olmayan türler ve dizeler istemcide sunucuyla karşılaştırıldığında farklı şekilde işlenebilir. İstemcide:
- Bir değer yalnızca giriş girilirse mevcut olarak kabul edilir. Bu nedenle, istemci tarafı doğrulama null değer atılabilir olmayan türleri null değer atılabilir türler ile aynı şekilde işler.
- Bir dize alanında boşluk, jQuery Doğrulama gerekli yöntemi tarafından geçerli giriş olarak kabul edilir. Yalnızca boşluk girilirse sunucu tarafı doğrulama gerekli bir dize alanını geçersiz olarak kabul ediyor.
Daha önce belirtildiği gibi, null değer atılabilir olmayan türler bir özniteliğine sahip gibi kabul [Required(AllowEmptyStrings = true)] edilir. Bu, özniteliğini uygulamasanız bile istemci tarafı doğrulamasını alasanız bile [Required(AllowEmptyStrings = true)] olur. Ancak özniteliğini kullansanız varsayılan bir hata iletisi alırsınız. Özel bir hata iletisi belirtmek için özniteliğini kullanın.
[Remote] özniteliği
özniteliği, alan girişinin geçerli olup olmadığını belirlemek için sunucuda bir yöntem [Remote] çağırmayı gerektiren istemci tarafı doğrulamasını uygulamaya alır. Örneğin, uygulamanın bir kullanıcı adının zaten kullanımda olup olmadığını doğrulaması gerekir.
Uzaktan doğrulama uygulamak için:
JavaScript'in çağırılması için bir eylem yöntemi oluşturun. jQuery Validate uzak yöntemi bir JSON yanıtı bekler:
"true", giriş verisi geçerli olduğu anlamına gelir."false",undefinedveyanullgirişin geçersiz olduğu anlamına gelir. Varsayılan hata iletisini görüntüler.- Diğer dizeler girişin geçersiz olduğu anlamına gelir. Dizeyi özel bir hata iletisi olarak görüntüler.
Özel hata iletisi döndüren bir eylem yöntemi örneği:
[AcceptVerbs("Get", "Post")] public IActionResult VerifyEmail(string email) { if (!_userRepository.VerifyEmail(email)) { return Json($"Email {email} is already in use."); } return Json(true); }Model sınıfında, özelliğine aşağıdaki örnekte gösterildiği gibi doğrulama eylemi yönteminin gösterildiği
[Remote]bir öznitelikle açıklama ekleme:[Remote(action: "VerifyEmail", controller: "Users")] public string Email { get; set; }özniteliği
[Remote]ad alanıMicrosoft.AspNetCore.Mvciçindedir. veya meta paketini kullanmadısanız Microsoft.AspNetCore.Mvc.ViewFeatures NuGet paketiniMicrosoft.AspNetCore.AppMicrosoft.AspNetCore.Allyükleyin.
Ek alanlar
özniteliğinin AdditionalFields [Remote] özelliği, sunucu üzerinde verilerde alan birleşimlerini doğrulamanızı sağlar. Örneğin, model ve özelliklerine sahipse, mevcut hiçbir kullanıcının zaten bu ad User FirstName LastName çiftini olmadığını doğrulamak istiyor olabilir. Aşağıdaki örnekte, kullanımının nasıl olduğu AdditionalFields gösterir:
[Remote(action: "VerifyName", controller: "Users", AdditionalFields = nameof(LastName))]
public string FirstName { get; set; }
[Remote(action: "VerifyName", controller: "Users", AdditionalFields = nameof(FirstName))]
public string LastName { get; set; }
AdditionalFields , ve dizelerine açıkça "FirstName" "LastName" ayarlansa da nameof işlecinin kullanımı daha sonra yeniden düzenlemeyi basitleştiriyor. Bu doğrulama için eylem yönteminin hem ad hem de soyadı bağımsız değişkenlerini kabul etmeleri gerekir:
[AcceptVerbs("Get", "Post")]
public IActionResult VerifyName(string firstName, string lastName)
{
if (!_userRepository.VerifyName(firstName, lastName))
{
return Json($"A user named {firstName} {lastName} already exists.");
}
return Json(true);
}
Kullanıcı bir ad veya soyadı girdiği zaman JavaScript, bu ad çiftinin alınarak alınamaysa bile uzak bir çağrı yapar.
İki veya daha fazla ek alanı doğrulamak için bunları virgülle ayrılmış liste olarak girin. Örneğin, modele MiddleName özellik eklemek için [Remote] özniteliğini aşağıdaki örnekte gösterildiği gibi ayarlayın:
[Remote(action: "VerifyName", controller: "Users", AdditionalFields = nameof(FirstName) + "," + nameof(LastName))]
public string MiddleName { get; set; }
AdditionalFields, tüm öznitelik bağımsız değişkenleri gibi sabit bir ifade olması gerekir. Bu nedenle, başlatmak için ilişkilendirme dizesi veya çağrısı Join AdditionalFields kullanmayın.
Yerleşik özniteliklerin alternatifleri
Yerleşik öznitelikler tarafından sağlanmaz doğrulamaya ihtiyacınız varsa şunları da kullanabilirsiniz:
Özel öznitelikler
Yerleşik doğrulama özniteliklerinin işlemey olduğu senaryolar için özel doğrulama öznitelikleri oluşturabilirsiniz. 'den devralan bir sınıf oluşturun ValidationAttribute ve yöntemini geçersiz IsValid kılın.
yöntemi, IsValid doğrulanması gereken giriş olan adlı bir nesneyi kabul eder. Aşırı yükleme, model bağlaması tarafından oluşturulan model örneği gibi ek bilgiler ValidationContext sağlayan bir nesneyi de kabul eder.
Aşağıdaki örnek, Klasik türe sahip bir film için yayın tarihini belirtilen bir yıldan daha geç olmadığını doğrular. özniteliği [ClassicMovie2] önce türü denetler ve yalnızca Klasik ise devam eder. Klasik olarak tanımlanan filmlerde, öznitelik oluşturucuya geçirilen sınırdan daha geç olmadığını kontrol etmek için yayın tarihini denetler.
public class ClassicMovieAttribute : ValidationAttribute
{
private int _year;
public ClassicMovieAttribute(int year)
{
_year = year;
}
protected override ValidationResult IsValid(
object value, ValidationContext validationContext)
{
var movie = (Movie)validationContext.ObjectInstance;
var releaseYear = ((DateTime)value).Year;
if (movie.Genre == Genre.Classic && releaseYear > _year)
{
return new ValidationResult(GetErrorMessage());
}
return ValidationResult.Success;
}
public int Year => _year;
public string GetErrorMessage()
{
return $"Classic movies must have a release year no later than {_year}.";
}
}
Yukarıdaki movie örnekteki değişken, form Movie gönderimi verilerini içeren bir nesneyi temsil eder. yöntemi, IsValid tarihi ve türü denetler. Doğrulama başarılı oldu sonra IsValid bir kod ValidationResult.Success döndürür. Doğrulama başarısız olduğunda, ValidationResult bir hata iletisi döndürülür.
IValidatableObject
Yukarıdaki örnek yalnızca türlerle Movie çalışır. Sınıf düzeyinde doğrulamanın bir diğer seçeneği de aşağıdaki IValidatableObject örnekte gösterildiği gibi model sınıfında uygulamaktır:
public class MovieIValidatable : IValidatableObject
{
private const int _classicYear = 1960;
public int Id { get; set; }
[Required]
[StringLength(100)]
public string Title { get; set; }
[Required]
public DateTime ReleaseDate { get; set; }
[Required]
[StringLength(1000)]
public string Description { get; set; }
[Range(0, 999.99)]
public decimal Price { get; set; }
[Required]
public Genre Genre { get; set; }
public bool Preorder { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (Genre == Genre.Classic && ReleaseDate.Year > _classicYear)
{
yield return new ValidationResult(
$"Classic movies must have a release year earlier than {_classicYear}.",
new[] { "ReleaseDate" });
}
}
}
Üst düzey düğüm doğrulaması
Üst düzey düğümler şunlardır:
- Eylem parametreleri
- Denetleyici özellikleri
- Sayfa işleyicisi parametreleri
- Sayfa modeli özellikleri
Modele bağlı üst düzey düğümler, model özelliklerinin doğrulanmasına ek olarak doğrulanır. Örnek uygulamanın aşağıdaki örneğinde yöntemi eylem VerifyPhone parametresini RegularExpressionAttribute doğrulamak için phone kullanır:
[AcceptVerbs("Get", "Post")]
public IActionResult VerifyPhone(
[RegularExpression(@"^\d{3}-\d{3}-\d{4}$")] string phone)
{
if (!ModelState.IsValid)
{
return Json($"Phone {phone} has an invalid format. Format: ###-###-####");
}
return Json(true);
}
Üst düzey düğümler doğrulama BindRequiredAttribute öznitelikleriyle kullanılabilir. Örnek uygulamanın aşağıdaki örneğinde yöntemi, form gönderiken parametresinin sorgu CheckAge age dizesine bağlı olması gerektiğini belirtir:
[HttpPost]
public IActionResult CheckAge(
[BindRequired, FromQuery] int age)
{
Check Age sayfasında (CheckAge.cshtml) iki biçim vardır. İlk form bir değerini Age sorgu 99 dizesi olarak gönderir: https://localhost:5001/Users/CheckAge?Age=99 .
Sorgu dizesinden age düzgün biçimlendirilmiş bir parametre gönder kullanıldığında form doğrular.
Yaş Denetimi sayfasındaki ikinci form, isteğin gövdesinde değeri göndermektedir Age ve doğrulama başarısız olur. Parametrenin bir sorgu age dizesinden olması gerekirken bağlama başarısız oluyor.
veya sonraki CompatibilityVersion.Version_2_1 bir ile çalıştırıldıklarda, üst düzey düğüm doğrulaması varsayılan olarak etkindir. Aksi takdirde, üst düzey düğüm doğrulaması devre dışı bırakılır. Varsayılan seçenek, burada gösterildiği gibi () içinde AllowValidatingTopLevelNodes özelliği Startup.ConfigureServices ayarlarak geçersiz kılınabilir:
services.AddMvc(options =>
{
options.MaxModelValidationErrors = 50;
options.AllowValidatingTopLevelNodes = false;
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
Maksimum hata sayısı
Maksimum hata sayısına ulaşıldı (varsayılan olarak 200) doğrulama durur. Bu s numarayı içinde aşağıdaki kodla Startup.ConfigureServices yapılandırabilirsiniz:
services.AddMvc(options =>
{
options.MaxModelValidationErrors = 50;
options.ModelBindingMessageProvider.SetValueMustNotBeNullAccessor(
(_) => "The field is required.");
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSingleton
<IValidationAttributeAdapterProvider,
CustomValidationAttributeAdapterProvider>();
En fazla yeniden çalışma
ValidationVisitor doğrulanmış olan modelin nesne grafiğinde çapraz geçişler. Çok derin veya sonsuz olarak tekrarlayan modeller için doğrulama yığın taşmasına neden olabilir. MvcOptions.MaxValidationDepth, ziyaretçi özyineleme yapılandırılmış bir derinliği aşarsa doğrulamayı erken durdurmak için bir yol sağlar. veya sonraki bir MvcOptions.MaxValidationDepth değerle çalıştırıldıklarında varsayılan değeri CompatibilityVersion.Version_2_2 32'dir. Önceki sürümler için değer null, yani derinlik kısıtlaması yoktur.
Otomatik kısa devre
Model grafı doğrulama gerektirmezse doğrulama otomatik olarak kısa devreli (atlanır). Çalışma zamanının doğrulamayı atlayıp atlayacağı nesneler, temel öğe koleksiyonlarını (, , ) ve herhangi bir doğrulayıcısı olan karmaşık byte[] string[] nesne Dictionary<string, string> graflarını içerir.
Doğrulamayı devre dışı bırakma
Doğrulamayı devre dışı bırakmak için:
Herhangi bir alanı
IObjectModelValidatorgeçersiz olarak işaretlemeyen bir uygulaması oluşturun.public class NullObjectModelValidator : IObjectModelValidator { public void Validate( ActionContext actionContext, ValidationStateDictionary validationState, string prefix, object model) { } }bağımlılık ekleme kapsayıcısı
Startup.ConfigureServicesvarsayılan uygulamasını değiştirmek için aşağıdaki koduIObjectModelValidatorekleyin.// There is only one `IObjectModelValidator` object, // so AddSingleton replaces the default one. services.AddSingleton<IObjectModelValidator>(new NullObjectModelValidator());
Model bağlamadan kaynaklanan model durumu hataları görmeye devam edersiniz.
İstemci tarafı doğrulama
İstemci tarafı doğrulama, form geçerli olana kadar gönderimi önler. Gönder düğmesi, formu gönderen veya hata iletilerini görüntüleyen JavaScript çalıştırır.
İstemci tarafı doğrulama, bir formda giriş hataları olduğunda sunucuya gereksiz bir gidiş dönüşten kaçınıyor. _Layout.cshtml ve _ValidationScriptsPartial.cshtml dosyasındaki aşağıdaki betik başvuruları istemci tarafı doğrulamayı destekler:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/jquery.validate.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.min.js"></script>
jQuery Unobtrusive Validation betiği, popüler jQuery Validate eklentisini kullanarak özel bir Microsoft ön uç kitaplığıdır. jQuery İzinSiz Doğrulama olmadan, aynı doğrulama mantığını iki yerde kodlatırsınız: model özelliklerinde sunucu tarafı doğrulama özniteliklerine bir kez ve ardından istemci tarafı betiklerinde tekrar. Bunun yerine, Etiket Yardımcıları ve HTML yardımcıları doğrulama özniteliklerini kullanır ve doğrulamaya ihtiyaç olan form öğeleri için HTML 5 özniteliklerini işlemek üzere model özelliklerinden meta data- veriler yazın. jQuery Unobtrusive Validation öznitelikleri ayrıştırıyor ve mantığı jQuery Validate'e iletir ve sunucu tarafı doğrulama mantığını istemciye etkili bir şekilde data- "kopyalama". Burada gösterildiği gibi etiket yardımcılarını kullanarak istemcide doğrulama hatalarını görüntüebilirsiniz:
<div class="form-group">
<label asp-for="ReleaseDate" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="ReleaseDate" class="form-control" />
<span asp-validation-for="ReleaseDate" class="text-danger"></span>
</div>
</div>
Yukarıdaki etiket yardımcıları aşağıdaki HTML'yi işler.
<form action="/Movies/Create" method="post">
<div class="form-horizontal">
<h4>Movie</h4>
<div class="text-danger"></div>
<div class="form-group">
<label class="col-md-2 control-label" for="ReleaseDate">ReleaseDate</label>
<div class="col-md-10">
<input class="form-control" type="datetime"
data-val="true" data-val-required="The ReleaseDate field is required."
id="ReleaseDate" name="ReleaseDate" value="">
<span class="text-danger field-validation-valid"
data-valmsg-for="ReleaseDate" data-valmsg-replace="true"></span>
</div>
</div>
</div>
</form>
data-HTML çıkışında özniteliklerin özelliği için doğrulama özniteliklerine karşılık gelen dikkat ReleaseDate edin. Özniteliği, data-val-required kullanıcı yayın tarihi alanını dolduramasa görüntülemek için bir hata iletisi içerir. jQuery Unobtrusive Validation bu değeri jQuery Validate required() yöntemine iletir ve ardından bu iletiyi eşlik eden öğede <span> görüntüler.
Bir öznitelik tarafından geçersiz kılınmadıkça, veri türü doğrulaması bir özelliğin .NET türüne [DataType] dayalıdır. Tarayıcılar kendi varsayılan hata iletilerine sahiptir, ancak jQuery Doğrulama Unobtrusive Validation paketi bu iletileri geçersiz kabilirsiniz. [DataType] gibi öznitelikler ve alt sınıflar [EmailAddress] hata iletisini belirtmenize izin verir.
Dinamik Formlara Doğrulama Ekleme
jQuery Unobtrusive Validation, sayfa ilk kez yüklenirken doğrulama mantığını ve parametrelerini jQuery Validate'e iletir. Bu nedenle doğrulama, dinamik olarak oluşturulan formlarda otomatik olarak çalışmaz. Doğrulamayı etkinleştirmek için jQuery Unobtrusive Validation'a dinamik formu oluşturduktan hemen sonra ayrıştırmasını söyleyin. Örneğin, aşağıdaki kod AJAX yoluyla eklenen bir formda istemci tarafı doğrulamayı ayarlar.
$.get({
url: "https://url/that/returns/a/form",
dataType: "html",
error: function(jqXHR, textStatus, errorThrown) {
alert(textStatus + ": Couldn't add form. " + errorThrown);
},
success: function(newFormHTML) {
var container = document.getElementById("form-container");
container.insertAdjacentHTML("beforeend", newFormHTML);
var forms = container.getElementsByTagName("form");
var newForm = forms[forms.length - 1];
$.validator.unobtrusive.parse(newForm);
}
})
yöntemi, $.validator.unobtrusive.parse() tek bağımsız değişkeni için bir jQuery seçicisi kabul eder. Bu yöntem, jQuery Unobtrusive Validation'a bu seçici içindeki formların data- özniteliklerini ayrıştırmasını söyler. Bu özniteliklerin değerleri daha sonra jQuery Validate eklentisine geçirildi.
Dinamik Denetimlere Doğrulama Ekleme
yöntemi, $.validator.unobtrusive.parse() ve gibi dinamik olarak oluşturulan tek tek denetimlerde değil formun tamamına göre <input> <select/> çalışır. Formu yeniden ayrıştırmak için, aşağıdaki örnekte gösterildiği gibi form daha önce ayrıştırıldıklarında eklenen doğrulama verilerini kaldırın:
$.get({
url: "https://url/that/returns/a/control",
dataType: "html",
error: function(jqXHR, textStatus, errorThrown) {
alert(textStatus + ": Couldn't add control. " + errorThrown);
},
success: function(newInputHTML) {
var form = document.getElementById("my-form");
form.insertAdjacentHTML("beforeend", newInputHTML);
$(form).removeData("validator") // Added by jQuery Validate
.removeData("unobtrusiveValidation"); // Added by jQuery Unobtrusive Validation
$.validator.unobtrusive.parse(form);
}
})
Özel istemci tarafı doğrulama
Özel istemci tarafı doğrulama, özel bir jQuery Validate bağdaştırıcısı ile data- çalışmak üzere HTML öznitelikleri üreterek yapılır. Aşağıdaki örnek bağdaştırıcı kodu, bu ClassicMovie ClassicMovie2 makalenin başlarında tanıtıldığı ve öznitelikleri için yazılmıştır:
$.validator.addMethod('classicmovie',
function (value, element, params) {
// Get element value. Classic genre has value '0'.
var genre = $(params[0]).val(),
year = params[1],
date = new Date(value);
if (genre && genre.length > 0 && genre[0] === '0') {
// Since this is a classic movie, invalid if release date is after given year.
return date.getUTCFullYear() <= year;
}
return true;
});
$.validator.unobtrusive.adapters.add('classicmovie',
['year'],
function (options) {
var element = $(options.form).find('select#Genre')[0];
options.rules['classicmovie'] = [element, parseInt(options.params['year'])];
options.messages['classicmovie'] = options.message;
});
Bağdaştırıcıları yazma hakkında bilgi için jQuery Doğrulama belgelerine bakın.
Verilen bir alan için bağdaştırıcının kullanımı şu öznitelikler data- tarafından tetiklenir:
- Alana doğrulamaya tabi olacak şekilde bayrak ekleme (
data-val="true"). - Doğrulama kuralı adını ve hata iletisi metnini (örneğin, )
data-val-rulename="Error message."tanımlama. - Doğrulayıcının ihtiyacı olan tüm ek parametreleri (örneğin, )
data-val-rulename-parm1="value"girin.
Aşağıdaki örnek, data- örnek uygulamanın özniteliğinin özniteliklerini ClassicMovie gösterir:
<input class="form-control" type="datetime"
data-val="true"
data-val-classicmovie1="Classic movies must have a release year earlier than 1960."
data-val-classicmovie1-year="1960"
data-val-required="The ReleaseDate field is required."
id="ReleaseDate" name="ReleaseDate" value="">
Daha önce belirtildiği gibi, Etiket Yardımcıları ve HTML yardımcıları öznitelikleri işlemek için doğrulama özniteliklerinden bilgileri data- kullanır. Özel HTML özniteliklerinin oluşturulmasıyla sonuç olarak kod yazmak için iki data- seçenek vardır:
- ve 'den türetilen bir sınıf oluşturun ve
AttributeAdapterBase<TAttribute>uygulayan bir sınıfIValidationAttributeAdapterProvideroluşturun ve özniteliğinizi ve bağdaştırıcısını DI'ye kaydettirin. Bu yöntem, sunucuyla ilgili ve istemciyle ilgili doğrulama kodundaki tek sorumluyu ayrı sınıflarda izler. Bağdaştırıcı ayrıca DI'ye kaydedildiklerinden, di'de diğer hizmetlerin gerekirse kullanılabilir olduğu avantajına da sahip olur. IClientModelValidatorSınıfınızaValidationAttributeuygulama. Özniteliğin sunucu tarafı doğrulama yapmama ve DI'den herhangi bir hizmete ihtiyacı yoksa bu yöntem uygun olabilir.
İstemci tarafı doğrulama için AttributeAdapter
HTML'de data- öznitelikleri işlemenin bu yöntemi, örnek ClassicMovie uygulamanın özniteliği tarafından kullanılır. Bu yöntemi kullanarak istemci doğrulaması eklemek için:
Özel doğrulama özniteliği için bir öznitelik bağdaştırıcısı sınıfı oluşturun. sınıfından sınıfını AttributeAdapterBase<TAttribute> türetin. Bu örnekte
AddValidationgösterildiğidata-gibi işlenmiş çıktıya öznitelikler ekleyen bir yöntem oluşturun:public class ClassicMovieAttributeAdapter : AttributeAdapterBase<ClassicMovieAttribute> { private int _year; public ClassicMovieAttributeAdapter(ClassicMovieAttribute attribute, IStringLocalizer stringLocalizer) : base (attribute, stringLocalizer) { _year = attribute.Year; } public override void AddValidation(ClientModelValidationContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } MergeAttribute(context.Attributes, "data-val", "true"); MergeAttribute(context.Attributes, "data-val-classicmovie", GetErrorMessage(context)); var year = Attribute.Year.ToString(CultureInfo.InvariantCulture); MergeAttribute(context.Attributes, "data-val-classicmovie-year", year); } public override string GetErrorMessage(ModelValidationContextBase validationContext) { return Attribute.GetErrorMessage(); } }uygulayan bir bağdaştırıcı sağlayıcı sınıfı IValidationAttributeAdapterProvider oluşturun. yönteminde, bu örnekte gösterildiği gibi özel özniteliği
GetAttributeAdapterbağdaştırıcının oluşturucus una iletir:public class CustomValidationAttributeAdapterProvider : IValidationAttributeAdapterProvider { IValidationAttributeAdapterProvider baseProvider = new ValidationAttributeAdapterProvider(); public IAttributeAdapter GetAttributeAdapter(ValidationAttribute attribute, IStringLocalizer stringLocalizer) { if (attribute is ClassicMovieAttribute classicMovieAttribute) { return new ClassicMovieAttributeAdapter(classicMovieAttribute, stringLocalizer); } else { return baseProvider.GetAttributeAdapter(attribute, stringLocalizer); } } }IÇINDE DI için bağdaştırıcı sağlayıcısını
Startup.ConfigureServiceskaydetme:services.AddMvc(options => { options.MaxModelValidationErrors = 50; options.ModelBindingMessageProvider.SetValueMustNotBeNullAccessor( (_) => "The field is required."); }) .SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddSingleton <IValidationAttributeAdapterProvider, CustomValidationAttributeAdapterProvider>();
İstemci tarafı doğrulama için IClientModelValidator
HTML'de data- öznitelikleri işlemenin bu yöntemi, örnek ClassicMovie2 uygulamanın özniteliği tarafından kullanılır. Bu yöntemi kullanarak istemci doğrulaması eklemek için:
Özel doğrulama özniteliğinde arabirimini
IClientModelValidatoruygulayan ve bir yöntemAddValidationoluşturun.AddValidationyönteminde, aşağıdaki örnekte gösterildiği gibi doğrulama içindata-öznitelikler ekleyin:public class ClassicMovie2Attribute : ValidationAttribute, IClientModelValidator { private int _year; public ClassicMovie2Attribute(int year) { _year = year; } protected override ValidationResult IsValid( object value, ValidationContext validationContext) { var movie = (Movie)validationContext.ObjectInstance; var releaseYear = ((DateTime)value).Year; if (movie.Genre == Genre.Classic && releaseYear > _year) { return new ValidationResult(GetErrorMessage()); } return ValidationResult.Success; } public void AddValidation(ClientModelValidationContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } MergeAttribute(context.Attributes, "data-val", "true"); MergeAttribute(context.Attributes, "data-val-classicmovie", GetErrorMessage()); var year = _year.ToString(CultureInfo.InvariantCulture); MergeAttribute(context.Attributes, "data-val-classicmovie-year", year); } private bool MergeAttribute(IDictionary<string, string> attributes, string key, string value) { if (attributes.ContainsKey(key)) { return false; } attributes.Add(key, value); return true; } protected string GetErrorMessage() { return $"Classic movies must have a release year no later than {_year} [from attribute 2]."; } }
İstemci tarafı doğrulamayı devre dışı bırakma
Aşağıdaki kod, MVC görünümlerde istemci doğrulamasını devre dışı bıraktır:
services.AddMvc().AddViewOptions(options =>
{
if (_env.IsDevelopment())
{
options.HtmlHelperOptions.ClientValidationEnabled = false;
}
});
RazorSayfalarda:
services.Configure<HtmlHelperOptions>(o => o.ClientValidationEnabled = false);
İstemci doğrulamasını devre dışı bırakmanın bir diğer seçeneği de _ValidationScriptsPartial .cshtml dosyanız içinde başvurusuna açıklama eklemektir.