Πολυγλωσσική υποστήριξη για 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");}
}