สนับสนุนการสนับสนุนหลายภาษาสําหรับการนําทางข้อมูลสําหรับชื่อพารามิเตอร์และป้อนข้อความการตรวจสอบความถูกต้อง

วันที่สร้างเพจ :

สภาพแวดล้อม

ASP.NET Core
  • 5.0 MVC

หลักฐาน

เคล็ดลับนี้หมายความว่าคุณเข้าใจเคล็ดลับต่อไปนี้:

นอกจากนี้หากคุณต้องการสร้างโครงการใหม่ให้เพิ่มไฟล์และรหัสต่อไปนี้ตามเคล็ดลับข้างต้น:

  • 创建 SharedResource.resx (+ en, es) 文件。 (เนื้อหาอาจว่างเปล่า)
  • สร้างแฟ้ม.csทรัพยากรที่ใช้ร่วมกัน
  • เพิ่มรหัสการแปลเป็นภาษาท้องถิ่นไปยังบริการเริ่มต้น.กําหนดค่า
  • เพิ่มรหัสการแปลเป็นภาษาท้องถิ่นลงใน Start.Connco

แก้ไข.csเริ่มต้น

เนื่องจากจําเป็นต้องมีการตั้งค่าหลายภาษาอื่นๆ ที่เกี่ยวข้องกับการแจ้งเตือนข้อมูล 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แบบจําลองมุมมองผู้ใช้"

รหัสเป็นดังนี้: namespace ควรจัดตําแหน่งอย่างเหมาะสม คุณสมบัติที่คุณตั้งค่าไม่เกี่ยวข้องกับหลายภาษา เนื่องจากคุณสมบัติเหล่านั้นถูกกําหนดไว้เท่านั้น การสนับสนุนหลายภาษาจะเกิดขึ้นในภายหลัง

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

เชื่อมโยงไปยังหน้าจอการลงทะเบียนผู้ใช้

สร้างลิงก์ไปยังหน้าจอการลงทะเบียนผู้ใช้ในมุมมอง\โฮม\ดัชนี.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 รหัสจะถูกข้อคิดเห็นด้วย เมื่อสร้างรหัสในชั้นวางจะผิดที่จะใส่คุณสมบัติในคุณสมบัติเฉพาะ ข้อคิดเห็นเกี่ยวกับมุมมองชั่วคราวก่อนที่จะสร้างมุมมอง

หากคุณพบข้อผิดพลาดในการสร้าง Razor ให้สร้างมุมมอง 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 จะแสดงชื่อ ID_DisplayName
ข้อความแสดงข้อผิดพลาดเมื่อไม่ได้ป้อน ID Validate_Required
รหัสป้อนข้อความแสดงข้อผิดพลาดเมื่ออักขระมากกว่า 20 อักขระ Validate_StringLength
ข้อความแสดงข้อผิดพลาดเมื่อป้อนอักขระที่ไม่ใช่ตัวอักษรและตัวเลขโดยใช้ ID Validate_Alphanumeric
พารามิเตอร์ชื่อแสดงชื่อ Name_DisplayName
ข้อความแสดงข้อผิดพลาดเมื่อชื่อถูกป้อนมากกว่า 50 อักขระ Validate_StringLength

Validate_XXXXX มันควรจะเป็นสากล ไม่มีแบบแผนการตั้งชื่อคีย์ เพื่อให้คุณสามารถใช้แบบได้ตามต้องการ

จากคีย์เหล่านี้ SharedResource.resx SharedResource.en.resx เราจะ SharedResource.es.resx เติมข้อความที่แปลแล้ว

SharedResource.resx

ค่าชื่อ
Validate_Required {0}เป็นฟิลด์บังคับ
Validate_StringLength {0}สามารถป้อนอักขระได้สูงสุด {1} ตัว
Validate_Alphanumeric {0}สามารถป้อนอักขระตัวอักษรและตัวเลขได้เท่านั้น
ID_DisplayName ID (ตัวอักษรครึ่งมุมและตัวเลข)
Name_DisplayName ชื่อ

SharedResource.en.resx

ค่าชื่อ
Validate_Required "{0}" is a required input.
Validate_StringLength The maximum number of characters that can be entered in "{0}" is "{1}".
Validate_Alphanumeric Only alphanumeric characters can be entered for "{0}".
ID_DisplayName ID (alphanumeric characters)
Name_DisplayName Full name

SharedResource.es.resx

ค่าชื่อ
Validate_Required "{0}" es una entrada obligatoria.
Validate_StringLength El número máximo de caracteres que se pueden ingresar en "{0}" es "{1}".
Validate_Alphanumeric Solo se pueden ingresar caracteres alfanuméricos para "{0}".
ID_DisplayName ID (caracteres alfanuméricos)
Name_DisplayName Nombre completo

ป้อนข้อความแสดงข้อผิดพลาดการตรวจสอบความถูกต้องเพื่อแทนที่ชื่อพารามิเตอร์และตัวเลขด้วย {0} หรือ {1} เป็นต้น ใช้ประโยชน์จากมันอย่างแข็งขัน

หลายภาษานําไปใช้กับการนําทางข้อมูล

การตั้งค่าหลายภาษาทั้งหมดจะถูกนําไปใช้กับคุณสมบัติแบบจําลอง

เมื่อต้องการนําไปใช้กับชื่อที่แสดงของพารามิเตอร์ Display ให้แนบและ Name ระบุคีย์ทรัพยากรที่ใช้ร่วมกัน.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 จํากัด โดยคุณสมบัติเครื่องหมายป้อนเข้า หากคุณต้องการดูข้อความ คุณจะต้องยกเลิกข้อจํากัด เช่น ใช้เครื่องมือสําหรับนักพัฒนาเว็บเบราว์เซอร์

โดยวิธีการที่เมื่อคุณลงทะเบียนเช่นอายุและวันที่ว่างเปล่าบางข้อความจะปรากฏขึ้นในภาษาอังกฤษ นี่คือข้อความที่ตั้งค่าที่ Framework end และเราจะอธิบายวิธีจัดการกับหลายภาษาในเคล็ดลับแยกต่างหาก

เกี่ยวกับรหัสทั้งหมด

เคล็ดลับนี้จะแสดงรายการเฉพาะคุณสมบัติบางอย่าง แต่โค้ดตัวอย่างครอบคลุมฟิลด์อินพุตทั้งหมดที่สอดคล้องกับ HTML5 หากคุณต้องการยืนยันโปรดดูที่ลิงก์ในหน้าข้างต้น

โพสต์ในส่วนต่อไปนี้

UserViewModel.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,
  }
}

HomeController.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()));
  }
}

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