Πολυγλωσσική υποστήριξη για dataAnnotations που χρησιμοποιούνται για ονόματα παραμέτρων, μηνύματα επικύρωσης εισόδου κ.λπ.
περιβάλλον
- πυρήνας ASP.NET
-
- 5.0 MVC
προϋπόθεση
Αυτές οι Συμβουλές γράφονται ως κατανόηση των ακόλουθων συμβουλών:
Επίσης, εάν δημιουργείτε ένα νέο έργο, πρέπει να έχετε προσθέσει τα ακόλουθα αρχεία και κώδικα με βάση τις παραπάνω συμβουλές.
- Δημιουργήστε ένα αρχείο SharedResource.resx (+en, es). (Τα περιεχόμενα μπορεί να είναι κενά.)
- Δημιουργία αρχείου sharedResource.cs
- Προσθήκη κωδικού τοπικής προσαρμογής στο Startup.ConfigureServices
- Προσθήκη κωδικού τοπικής προσαρμογής στην εκκίνηση.Ρύθμιση παραμέτρων
Ενημερώσεις κώδικα .cs εκκίνησης
Επειδή απαιτούνται πρόσθετες πολύγλωσσες ρυθμίσεις που σχετίζονται με το DataAnnotations, Startup.ConfigureServices
τροποποιήστε τη μέθοδο ως εξής:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddMvc()
// ローカライズに必要。Resx ファイルのフォルダパスを指定
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix, opts => { opts.ResourcesPath = "Resources"; })
// DataAnnotations のローカライズに必要 (追加)
.AddDataAnnotationsLocalization(options =>
{
// DataAnnotation を使ったときのメッセージは SharedResource に集約する
options.DataAnnotationLocalizerProvider = (type, factory) => factory.Create(typeof(SharedResource));
});
}
Μοντελοποίηση για είσοδο
Δημιουργήστε ένα μοντέλο για να δεσμεύσετε στην οθόνη εισόδου. Σε αυτό το δείγμα, έχουμε δημιουργήσει μια σειρά από ιδιότητες για να φιλοξενήσουμε διάφορα στοιχεία ελέγχου εισόδου. Εάν αντιμετωπίζετε προβλήματα με τη δημιουργία, μπορείτε απλά να δημιουργήσετε δύο.
Δημιουργήστε ένα .cs UserViewModel στο φάκελο Μοντέλα.
Ο κωδικός πρέπει να έχει την εξής εμφάνιση: Ο χώρος ονομάτων θα πρέπει να είναι κατάλληλος. Τα χαρακτηριστικά που ορίσετε δεν είναι πολύ συναφή με πολλές γλώσσες, επειδή τους ανατίθενται μόνο. Η πολύγλωσση υποστήριξη θα γίνει αργότερα.
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace LocalizationDataAnnotation.Models
{
public class UserViewModel
{
[Required]
[Display(Name = "ID (半角英数字)")]
[StringLength(20)]
[RegularExpression(@"^[0-9a-zA-Z]*$")]
public string ID { get; set; }
[StringLength(50)]
public string Name { get; set; }
[StringLength(50, MinimumLength = 8)]
[DataType(DataType.Password)]
[RegularExpression(@"^[0-9a-zA-Z]*$", ErrorMessage = "Password")]
public string Password { get; set; }
// 省略
}
// 省略
}
Δημιουργία ενέργειας
Δημιουργήστε ενέργειες για να εμφανίσετε την οθόνη εγγραφής του χρήστη και να εκτελέσετε HomeController
ενέργειες εγγραφής.
Η δημιουργία οθονών και ενεργειών δεν είναι το κύριο θέμα αυτών των Συμβουλών, επομένως είναι σκόπιμο. Επιπλέον, η πραγματική διαδικασία εγγραφής δεν εκτελείται.
// 初期コードは省略
namespace LocalizationDataAnnotation.Controllers
{
public class HomeController : Controller
{
// 初期コードは省略
public IActionResult Create()
{
return View();
}
[HttpPost]
public IActionResult Create(UserViewModel model)
{
// エラーなら差し戻し
if (ModelState.IsValid == false) return View(model);
// 正常に登録できた場合は Index に戻る
return RedirectToAction(nameof(Index));
}
}
}
Σύνδεση με την οθόνη εγγραφής χρήστη
Δημιουργήστε μια σύνδεση με την οθόνη εγγραφής χρήστη στο Views\Home\Index.cshtml. Μπορείτε να γράψετε οτιδήποτε, αρκεί να μπορείτε να έχετε μια μετάβαση στην οθόνη.
asp-route-culture
Το χαρακτηριστικό ανοίγει τη σελίδα στην καθορισμένη γλώσσα.
<!-- 初期コード省略 -->
<ul>
<li><a asp-action="Create">Create</a></li>
<li><a asp-action="Create" asp-route-culture="ja">Create (ja)</a></li>
<li><a asp-action="Create" asp-route-culture="en">Create (en)</a></li>
<li><a asp-action="Create" asp-route-culture="es">Create (es)</a></li>
</ul>
Δημιουργία οθόνης εγγραφής χρήστη
Create
Κάντε δεξί κλικ στην ενέργεια και επιλέξτε Προσθήκη προβολής.
Επιλέξτε Προβολή ξυραφιού.
Κάντε το πρότυπο "Δημιουργία" και την κατηγορία μοντέλου "UserViewModel".
Αν χρησιμοποιείτε το δείγμα UserViewModel
κώδικα, συμπεριέλαβα επίσης σχόλια στον κώδικα.
Εάν τοποθετήσετε ορισμένα χαρακτηριστικά σε μια ιδιότητα, θα λάβετε ένα σφάλμα κατά τη δημιουργία κώδικα σε σκαλωσιές.
Σχολιάστε προσωρινά πριν δημιουργήσετε μια προβολή.
Εάν εμφανιστεί πραγματικά ένα σφάλμα κατά τη δημιουργία του, δημιουργήστε μια κενή προβολή Razor και συμπεριλάβετε τον ακόλουθο κώδικα:
@model LocalizationDataAnnotation.Models.UserViewModel
@using System.Globalization;
@{
ViewData["Title"] = "Create";
}
<h1>Create</h1>
<h4>UserViewModel</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="ID" class="control-label"></label>
<input asp-for="ID" class="form-control" />
<span asp-validation-for="ID" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Name" class="control-label"></label>
<input asp-for="Name" class="form-control" />
<span asp-validation-for="Name" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Password" class="control-label"></label>
<input asp-for="Password" class="form-control" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
<!-- 省略 -->
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary" asp-route-culture="@CultureInfo.CurrentCulture.Name" />
</div>
</form>
</div>
</div>
<div>
<a asp-action="Index">Back to List</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
Προς το παρόν, ως προπαρασκευαστικό στάδιο, μπορείτε να δημιουργήσετε τον κώδικα μέχρι στιγμής με επιτυχία και να προσπαθήσετε να δείτε και να εκτελέσετε σωστά την οθόνη.
Πολύγλωσση εγγραφή κειμένου για σχόλια δεδομένων
Όλες οι ιδιότητες είναι πολύ μεγάλες για να εξηγήσουν, έτσι θα ID
μιλήσουμε και για . Name
Άλλα καταλύματα είναι πολύγλωσσα με παρόμοιο τρόπο, οπότε δοκιμάστε τα.
Τα ακόλουθα κείμενα είναι διαθέσιμα σε πολλές γλώσσες εδώ.
Πλήκτρα κειμένου με πολλές γλωσσικές χρονιές | |
---|---|
Όνομα εμφάνισης παραμέτρου αναγνωριστικού | ID_DisplayName |
Μήνυμα λάθους όταν δεν έχει εισαχθεί αναγνωριστικό | Validate_Required |
Μήνυμα λάθους όταν ο χαρακτήρας εισαγωγής αναγνωριστικού υπερβαίνει τους 20 χαρακτήρες | Validate_StringLength |
Μήνυμα σφάλματος όταν πληκτρολογείται αναγνωριστικό με μη αριθμητικούς χαρακτήρες | Validate_Alphanumeric |
Όνομα εμφανιζόμενου ονόματος παραμέτρου | Name_DisplayName |
Μήνυμα λάθους όταν το όνομα έχει περισσότερους από 50 χαρακτήρες που έχουν εισαχθεί | Validate_StringLength |
Validate_XXXXX
να είσαι συμπανής. Δεν υπάρχει βασική σύμβαση ονομασίας, ώστε να μπορείτε να την συνδέσετε ελεύθερα.
Χρησιμοποιώντας αυτά τα κλειδιά ως βάση, SharedResource.resx
θα συμπληρώσουμε το SharedResource.en.resx
μεταφρασμένο κείμενο σε SharedResource.es.resx
, .
ΚοινόχρηστοResource.resx
Τιμή ονόματος | |
---|---|
Validate_Required | Απαιτείται "{0}". |
Validate_StringLength | Μπορείτε να εισαγάγετε έως και "{1}" στο "{0}". |
Validate_Alphanumeric | {0} μπορεί να είναι μόνο αλφαριθμητικό. |
ID_DisplayName | Αναγνωριστικό (αλφαριθμητικό) |
Name_DisplayName | ταυτότητα |
Κοινή χρήση.en.resx
Τιμή ονόματος | |
---|---|
Validate_Required | Το "{0}" είναι μια απαιτούμενη είσοδος. |
Validate_StringLength | Ο μέγιστος αριθμός χαρακτήρων που μπορούν να εισαχθούν στο "{0}" είναι "{1}". |
Validate_Alphanumeric | Μόνο αλφαριθμητικούς χαρακτήρες μπορούν να εισαχθούν για το "{0}". |
ID_DisplayName | Αναγνωριστικό (αλφαριθμητικούς χαρακτήρες) |
Name_DisplayName | Ονοματεπώνυμο |
Κοινή χρήση.es.resx
Τιμή ονόματος | |
---|---|
Validate_Required | "{0}" es una una υποχρεωτικά. |
Validate_StringLength | El número máximo de caracteres que se pueden ingresar en "{0}" es "{1}". |
Validate_Alphanumeric | Σόλο se pueden ingresar καράκτρες αλφαμουρέρικος παρα "{0}". |
ID_DisplayName | Ταυτότητα (καρακερές μηδανουμερίκος) |
Name_DisplayName | Ολοκλήρωση Νόμπρε |
Τα μηνύματα σφάλματος επικύρωσης εισόδου αντικαθιστούν τα ονόματα παραμέτρων και τους αριθμούς με {0} και {1}. Ας το χρησιμοποιήσουμε θετικά.
Πολυγλωσσική εφαρμογή σε DataΑναξιώσεις
Όλες οι πολύγλωσσες ρυθμίσεις εφαρμόζονται στα χαρακτηριστικά του μοντέλου (DataAnnotations).
Για να το εφαρμόσετε στο εμφανιζόμενο όνομα της παραμέτρου, Display
επισυνάψτε και καθορίστε ένα Name
κλειδί sharedResource.resx στην ιδιότητα.
Για να εφαρμόσετε σε μηνύματα σφάλματος κατά την επικύρωση εισόδου, καθορίστε ένα ErrorMessage
κλειδί sharedResource.resx στην ιδιότητα κάθε χαρακτηριστικού επικύρωσης.
public class UserViewModel
{
[Required(ErrorMessage = "Validate_Required")]
[Display(Name = "ID_DisplayName")]
[StringLength(20, ErrorMessage = "Validate_StringLength")]
[RegularExpression(@"^[0-9a-zA-Z]*$", ErrorMessage = "Validate_Alphanumeric")]
public string ID { get; set; }
[Display(Name = "Name_DisplayName")]
[StringLength(50, ErrorMessage = "Validate_StringLength")]
public string Name { get; set; }
// 省略
}
Αυτό ολοκληρώνει τη ρύθμιση. Μετά από αυτό, τρέξε να δεις πώς λειτουργεί.
Παρεμπιπτόντως, ο αριθμός των χαρακτήρων εισόδου περιορίζεται από το χαρακτηριστικό του maxlength
tag εισόδου.
Εάν θέλετε να δείτε το μήνυμα, πρέπει να καταργήσετε τους περιορισμούς, όπως στα εργαλεία προγραμματιστή του προγράμματος περιήγησης στο Web.
Παρεμπιπτόντως, υπάρχουν ορισμένα μηνύματα που εμφανίζονται κατά την εγγραφή της ηλικίας, της ημερομηνίας κ.λπ. Αυτό είναι ένα μήνυμα που έχει ρυθμιστεί από την πλευρά του πλαισίου, αλλά μια άλλη συμβουλή θα σας δείξει πώς να το υποστηρίξετε σε πολλές γλώσσες.
Για όλους τους κωδικούς
Αυτή η συμβουλή περιέχει μόνο ορισμένες ιδιότητες, αλλά το δείγμα κώδικα καλύπτει όλα τα πεδία εισόδου με δυνατότητα html5. Αν θέλετε να ελέγξετε, ανατρέξτε στον παραπάνω σύνδεσμο.
Παρατίθεται στο παρακάτω μέρος
ΧρήστηςΒιόμελ.cs
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace LocalizationDataAnnotation.Models
{
public class UserViewModel
{
[Required(ErrorMessage = "Validate_Required")]
[Display(Name = "ID_DisplayName")]
[StringLength(20, ErrorMessage = "Validate_StringLength")]
[RegularExpression(@"^[0-9a-zA-Z]*$", ErrorMessage = "Validate_Alphanumeric")]
public string ID { get; set; }
[Display(Name = "Name_DisplayName")]
[StringLength(50, ErrorMessage = "Validate_StringLength")]
public string Name { get; set; }
[Display(Name = "Password_DisplayName")]
[StringLength(50, MinimumLength = 8, ErrorMessage = "Validate_StringLengthRange")]
[DataType(DataType.Password)]
[RegularExpression(@"^[0-9a-zA-Z]*$", ErrorMessage = "Validate_Alphanumeric")]
public string Password { get; set; }
[Display(Name = "ConfirmPassword_DisplayName")]
[StringLength(50, MinimumLength = 8, ErrorMessage = "Validate_StringLengthRange")]
[DataType(DataType.Password)]
[Compare(nameof(Password), ErrorMessage = "Validate_Compare")]
public string ConfirmPassword { get; set; }
[Display(Name = "Email_DisplayName")]
[EmailAddress(ErrorMessage = "Validate_EmailAddress")]
[DataType(DataType.EmailAddress)] // スキャフォールディングするときはコメントアウトする
public string Email { get; set; }
[Display(Name = "Age_DisplayName")]
[Required(ErrorMessage = "Validate_Required")]
[Range(0, 150, ErrorMessage = "Validate_Range")]
public int Age { get; set; }
[Display(Name = "Gender_DisplayName")]
[Required(ErrorMessage = "Validate_Required")]
[EnumDataType(typeof(GenderType))]
public GenderType Gender { get; set; }
[Display(Name = "Birthday_DisplayName")]
[DataType(DataType.Date)]
public DateTime Birthday { get; set; }
[Display(Name = "Phone_DisplayName")]
[Phone(ErrorMessage = "Validate_Phone")]
[DataType(DataType.PhoneNumber)] // スキャフォールディングするときはコメントアウトする
public string Phone { get; set; }
[Display(Name = "PostalCode_DisplayName")]
[DataType(DataType.PostalCode)]
public string PostalCode { get; set; }
[Display(Name = "CreditCard_DisplayName")]
[CreditCard(ErrorMessage = "Validate_CreditCard")]
[DataType(DataType.CreditCard)] // スキャフォールディングするときはコメントアウトする
public string CreditCard { get; set; }
[Display(Name = "Money_DisplayName")]
[DataType(DataType.Currency)]
public decimal Money { get; set; }
[Display(Name = "StartDateTime_DisplayName")]
[DataType(DataType.DateTime)]
public DateTime StartDateTime { get; set; }
[Display(Name = "WakeUpTime_DisplayName")]
[DataType(DataType.Time)]
public TimeSpan WakeUpTime { get; set; }
[Display(Name = "Homepage_DisplayName")]
[Url(ErrorMessage = "Validate_Url")]
[DataType(DataType.Url)] // スキャフォールディングするときはコメントアウトする
public string Homepage { get; set; }
[Display(Name = "MyImage_DisplayName")]
[Url(ErrorMessage = "Validate_Url")]
[DataType(DataType.ImageUrl)] // スキャフォールディングするときはコメントアウトする
public string MyImage { get; set; }
[Display(Name = "MyColor_DisplayName")]
public string MyColor { get; set; }
[Display(Name = "WorkingDays_DisplayName")]
[MaxLength(5, ErrorMessage = "Validate_MaxLength")]
[EnumDataType(typeof(DayOfWeek))]
public DayOfWeek[] WorkingDays { get; set; }
[Display(Name = "VacationDay_DisplayName")]
[MinLength(3, ErrorMessage = "Validate_MinLength")]
[EnumDataType(typeof(DayOfWeek))]
public DayOfWeek[] VacationDay { get; set; }
[Display(Name = "Comment_DisplayName")]
[StringLength(200, ErrorMessage = "Validate_StringLength")]
[DataType(DataType.MultilineText)]
public string Comment { get; set; }
[Display(Name = "FileName_DisplayName")]
[FileExtensions(Extensions = "png", ErrorMessage = "Validate_FileExtensions")]
public string FileName { get; set; }
[Display(Name = "UploadFile_DisplayName")]
[DataType(DataType.Upload)]
public List<IFormFile> UploadFile { get; set; }
[Display(Name = "Month_DisplayName")]
public DateTime Month { get; set; }
[Display(Name = "Search_DisplayName")]
public string Search { get; set; }
[Display(Name = "Range_DisplayName")]
[Range(10, 100, ErrorMessage = "Validate_Range")]
public int Range { get; set; }
[Display(Name = "Week_DisplayName")]
public string Week { get; set; }
[Display(Name = "IsAccepted_DisplayName")]
[Required(ErrorMessage = "Validate_Required")]
public bool IsAccepted { get; set; }
}
public enum GenderType
{
None,
Man,
Woman,
Other,
}
}
Κατ' οίκον έλεγχος.cs
using LocalizationDataAnnotation.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
namespace LocalizationDataAnnotation.Controllers
{
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
return View();
}
public IActionResult Privacy()
{
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
public IActionResult Create()
{
SetDayOfWeeksViewData();
return View();
}
[HttpPost]
public IActionResult Create(UserViewModel model)
{
SetDayOfWeeksViewData();
// エラーなら差し戻し
if (ModelState.IsValid == false) return View(model);
// 正常に登録できた場合は Index に戻る
return RedirectToAction(nameof(Index));
}
<summary>曜日の一覧を ViewData に設定します。</summary>
private void SetDayOfWeeksViewData()
=> ViewData["DayOfWeeks"] = ((DayOfWeek[])Enum.GetValues(typeof(DayOfWeek))).Select(x => new SelectListItem(x.ToString(), ((int)x).ToString()));
}
}
Δημιουργία.cshtml
@model LocalizationDataAnnotation.Models.UserViewModel
@using System.Globalization;
@{
ViewData["Title"] = "Create";
}
<h1>Create</h1>
<h4>UserViewModel</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Create" enctype="multipart/form-data" >
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="ID" class="control-label"></label>
<input asp-for="ID" class="form-control" />
<span asp-validation-for="ID" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Name" class="control-label"></label>
<input asp-for="Name" class="form-control" />
<span asp-validation-for="Name" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Password" class="control-label"></label>
<input asp-for="Password" class="form-control" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="ConfirmPassword" class="control-label"></label>
<input asp-for="ConfirmPassword" class="form-control" />
<span asp-validation-for="ConfirmPassword" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Email" class="control-label"></label>
<input asp-for="Email" class="form-control" />
<span asp-validation-for="Email" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Age" class="control-label"></label>
<input asp-for="Age" class="form-control" />
<span asp-validation-for="Age" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Gender"></label>
<div>
<label><input type="radio" asp-for="Gender" value="@(GenderType.None)" />@(GenderType.None)</label>
<label><input type="radio" asp-for="Gender" value="@(GenderType.Man)" />@(GenderType.Man)</label>
<label><input type="radio" asp-for="Gender" value="@(GenderType.Woman)" />@(GenderType.Woman)</label>
</div>
<span asp-validation-for="Gender" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Birthday" class="control-label"></label>
<input asp-for="Birthday" class="form-control" />
<span asp-validation-for="Birthday" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Phone" class="control-label"></label>
<input asp-for="Phone" class="form-control" />
<span asp-validation-for="Phone" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="PostalCode" class="control-label"></label>
<input asp-for="PostalCode" class="form-control" />
<span asp-validation-for="PostalCode" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="CreditCard" class="control-label"></label>
<input asp-for="CreditCard" class="form-control" />
<span asp-validation-for="CreditCard" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Money" class="control-label"></label>
<input asp-for="Money" class="form-control" />
<span asp-validation-for="Money" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="StartDateTime" class="control-label"></label>
<input asp-for="StartDateTime" class="form-control" />
<span asp-validation-for="StartDateTime" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="WakeUpTime" class="control-label"></label>
<input asp-for="WakeUpTime" class="form-control" />
<span asp-validation-for="WakeUpTime" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Homepage" class="control-label"></label>
<input asp-for="Homepage" class="form-control" />
<span asp-validation-for="Homepage" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="MyImage" class="control-label"></label>
<input asp-for="MyImage" class="form-control" />
<span asp-validation-for="MyImage" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="MyColor" class="control-label"></label>
<input asp-for="MyColor" class="form-control" type="color" />
<span asp-validation-for="MyColor" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="WorkingDays" class="control-label"></label>
<select asp-for="WorkingDays" class="form-control" asp-items="@((IEnumerable<SelectListItem>)ViewData["DayOfWeeks"])" multiple></select>
<span asp-validation-for="WorkingDays" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="VacationDay" class="control-label"></label>
<select asp-for="VacationDay" class="form-control" asp-items="@((IEnumerable<SelectListItem>)ViewData["DayOfWeeks"])" multiple></select>
<span asp-validation-for="VacationDay" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Comment" class="control-label"></label>
<textarea asp-for="Comment" class="form-control"></textarea>
<span asp-validation-for="Comment" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="FileName" class="control-label"></label>
<input asp-for="FileName" class="form-control" />
<span asp-validation-for="FileName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="UploadFile" class="control-label"></label>
<input asp-for="UploadFile" type="file" multiple />
<span asp-validation-for="UploadFile" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Month" class="control-label"></label>
<input asp-for="Month" class="form-control" type="month" />
<span asp-validation-for="Month" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Search" class="control-label"></label>
<input asp-for="Search" class="form-control" type="search" />
<span asp-validation-for="Search" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Range" class="control-label"></label>
<input asp-for="Range" class="form-control" type="range" min="10" max="100" />
<span asp-validation-for="Range" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Week" class="control-label"></label>
<input asp-for="Week" class="form-control" type="week" />
<span asp-validation-for="Week" class="text-danger"></span>
</div>
<div class="form-group form-check">
<label class="form-check-label">
<input class="form-check-input" asp-for="IsAccepted" /> @Html.DisplayNameFor(model => model.IsAccepted)
</label>
</div>
<div class="form-group">
<input type="submit" value="Create" class="btn btn-primary" asp-route-culture="@CultureInfo.CurrentCulture.Name" />
</div>
</form>
</div>
</div>
<div>
<a asp-action="Index">Back to List</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}