पैरामीटर नाम, इनपुट सत्यापन संदेश आदि के लिए उपयोग किए जाने वाले डेटाननोटेशन के लिए बहुभाषी समर्थन।

पेज निर्माण की तारीख :

पर्यावरण

ASP.NET कोर
  • 5.0 एमवीसी

प्राक्कल्पना

इस टिप्स को निम्नलिखित सुझावों को समझने के रूप में लिखा गया है:

इसके अलावा, यदि आप एक नया प्रोजेक्ट बना रहे हैं, तो आपने ऊपर दिए गए सुझावों के आधार पर निम्नलिखित फ़ाइलों और कोड को जोड़ना होगा।

  • एक हैंडेरेसोर्स.resx (+en, es) फ़ाइल बनाएं। (सामग्री खाली हो सकती है।
  • एक शेयर्डरिसोर्स.cs फ़ाइल बनाएं
  • Startup.ConfigureServices में स्थानीयकरण कोड जोड़ें
  • Startup.कॉन्फ़िगर में स्थानीयकरण कोड जोड़ें

स्टार्टअप .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 एक उपयोगकर्ताव्यूमॉडल बनाएं।

कोड इस तरह दिखना चाहिए: नामस्थान उपयुक्त होना चाहिए। आपके द्वारा सेट किए गए गुण कई भाषाओं के लिए बहुत प्रासंगिक नहीं हैं क्योंकि उन्हें केवल उन्हें सौंपा गया है। बहुभाषी समर्थन बाद में किया जाएगा।

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 कार्रवाई पर सही क्लिक करें और ऐड व्यू चुनें।

रेजर व्यू चुनें।

टेम्पलेट "क्रिएट" और मॉडल क्लास "उपयोगकर्ताViewModel" बनाएं। अगर आप नमूना कोड का उपयोग कर रहे UserViewModel हैं, तो मैंने कोड में टिप्पणियां भी शामिल की हैं. यदि आप किसी संपत्ति में कुछ विशेषताएं डालते हैं, तो मचान में कोड उत्पन्न करते समय आपको एक त्रुटि मिलेगी। कृपया एक दृश्य बनाने से पहले अस्थायी रूप से टिप्पणी करें।

यदि आपको इसे बनाते समय वास्तव में कोई त्रुटि मिलती है, तो एक खाली रेजर दृश्य बनाएं और निम्नलिखित कोड शामिल करें:

@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
नाम दर्ज होने पर त्रुटि संदेश Validate_StringLength

Validate_XXXXX सार्वभौमिक हो। कोई महत्वपूर्ण नामकरण सम्मेलन नहीं है, इसलिए आप स्वतंत्र रूप से इसे संलग्न कर सकते हैं।

आधार के रूप में इन चाबियों का उपयोग करना, SharedResource.resx हम अनुवादित पाठ में भर SharedResource.en.resx SharedResource.es.resx देंगे, ।

शेयर्डरेसोर्स.रेसएक्स

नाम मूल्य
Validate_Required "{0}" की आवश्यकता है।
Validate_StringLength आप "{0}" में "{1}" तक दर्ज कर सकते हैं।
Validate_Alphanumeric {0} केवल अल्फान्यूमरिक हो सकते हैं।
ID_DisplayName आईडी (अल्फान्यूमेरिक)
Name_DisplayName पहचान

शेयर्डरेसोर्स.एन.रेसएक्स

नाम मूल्य
Validate_Required "{0}" एक आवश्यक इनपुट है।
Validate_StringLength "{0}" में दर्ज किए जा सकते हैं कि पात्रों की अधिकतम संख्या "{1}" है।
Validate_Alphanumeric "{0}" के लिए केवल अल्फान्यूमेरिक पात्रों में प्रवेश किया जा सकता है।
ID_DisplayName आईडी (अल्फान्यूमेरिक वर्ण)
Name_DisplayName पूरा नाम

शेयररेसोर्स.es.resx

नाम मूल्य
Validate_Required "{0}" ईएस ऊना entrada उपकृत ।
Validate_StringLength एल número máximo de caracteres que se pueden ingresar en "{0}" es "{1}" ।
Validate_Alphanumeric सोलो एसई प्यूडेन इनग्रेसर कैरेक्टेरेस अल्फेन्यूमेरिकोस पैरा "{0}" ।
ID_DisplayName आईडी (कैरेक्टरेस अल्फेनुमेरिकोस)
Name_DisplayName नोम्ब्रे कॉम्पल्टो

इनपुट सत्यापन त्रुटि संदेश पैरामीटर नाम और संख्या को {0} और {1} के साथ बदलते हैं। चलो इसका सकारात्मक उपयोग करते हैं।

डेटाननोटेशन के लिए बहुभाषी आवेदन

सभी बहुभाषी सेटिंग्स मॉडल (DataAnnotations) की विशेषताओं पर लागू होती हैं।

इसे पैरामीटर के डिस्प्ले नाम पर लागू करने के लिए, Display संपत्ति में एक Name साझारिsource.resx कुंजी संलग्न और निर्दिष्ट करें।

इनपुट सत्यापन के दौरान त्रुटि संदेशों पर लागू करने के लिए, प्रत्येक सत्यापन विशेषता की संपत्ति में एक ErrorMessage साझाResource.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 है। यदि आप संदेश देखना चाहते हैं, तो आपको प्रतिबंधों को हटाने की आवश्यकता है, जैसे कि आपके वेब ब्राउज़र के डेवलपर टूल में।

वैसे, अपनी उम्र, तारीख आदि को खाली दर्ज करते समय कुछ संदेश प्रदर्शित किए जाते हैं। यह एक संदेश है जो फ्रेमवर्क साइड पर स्थापित किया गया है, लेकिन एक अन्य टिप्स आपको दिखाएगा कि इसे कई भाषाओं में कैसे समर्थन दिया जाए।

सभी कोड के लिए

इस टिप्स में केवल कुछ गुण होते हैं, लेकिन नमूना कोड सभी 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");}
}