پیرامیٹر ناموں، ان پٹ توثیق پیغامات وغیرہ کے لیے استعمال ہونے والے ڈیٹا انوٹیشنز کے لیے کثیر لسانی معاونت۔

صفحہ تخلیق تاریخ :

ماحول

ASP.NET کور
  • 5.0 ایم وی سی

بنیاد

یہ تجاویز مندرجہ ذیل تجاویز کو سمجھنے کے طور پر لکھی گئی ہیں:

اس کے علاوہ، اگر آپ کوئی نیا پروجیکٹ بنا رہے ہیں، تو آپ نے مندرجہ ذیل فائلوں اور کوڈ کو اوپر کی تجاویز کی بنیاد پر شامل کیا ہوگا۔

  • ایک مشترکہ وسیلہ.راسکس (+این، ایس) مسل بنائیں۔ (مشمولات خالی ہو سکتے ہیں۔)
  • مشترکہ وسیلہ بنائیں.cs مسل
  • اسٹارٹ اپ میں مقامیت کوڈ شامل کریں۔تشکیل خدمات
  • شروع میں مقامیت کوڈ شامل کریں۔تشکیل کریں

اسٹارٹ اپ .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));
    }
  }
}

صارف رجسٹریشن سکرین سے ربط کریں

ویوز\ہوم\اشاریہ.سی ایس ایچ ٹی ایم میں صارف رجسٹریشن سکرین کا لنک بنائیں۔ جب تک آپ سکرین ٹرانزیشن کر سکتے ہیں آپ کچھ بھی لکھ سکتے ہیں۔

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 تو میں نے کوڈ میں تبصرے بھی شامل کیے ہیں۔ اگر آپ کسی پراپرٹی میں کچھ خصوصیات ڈالتے ہیں، تو آپ کو اسکیفلڈنگ میں کوڈ پیدا کرتے وقت ایک غلطی ملے گی۔ براہ کرم کوئی نقطہ نظر بنانے سے پہلے عارضی طور پر تبصرہ کریں۔

اگر آپ کو واقعی کوئی نقص ملتا ہے جب آپ اسے تخلیق کرتے ہیں، تو خالی ریزر منظر بنائیں اور درج ذیل کوڈ شامل کریں:

@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 .

مشترکہ وسائل.راسکس

نام قدر
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 پورا نام

مشترکہ وسائل.ایس.راسکس

نام قدر
Validate_Required "{0}" ایس اونا انٹراڈا لازمیہ ہے۔
Validate_StringLength ایل número máximo ڈی کیراکیٹرز کیو سی پوڈین انگریسر این "{0}" ایس "{1}" ہے۔
Validate_Alphanumeric سولو سی پیڈین انگریسر کیرایکٹرس الفانومیریکوس پیرا "{0}"۔
ID_DisplayName شناخت (کاریکٹرز الفانومیریکوس)
Name_DisplayName نومبری کمپلیٹو

ان پٹ توثیق نقص پیغامات پیرامیٹر ناموں اور نمبروں کو {0} اور {1} سے بدل دیتے ہیں۔ آئیے اسے مثبت طور پر استعمال کرتے ہیں۔

داتا تشریحات پر کثیر لسانی اطلاق

تمام کثیر لسانی ترتیبات ماڈل (ڈیٹا انوٹیشنز) کی خصوصیات پر لاگو ہوتی ہیں۔

اسے پیرامیٹر کے ڈسپلے نام پر لگانے کے لیے Display پراپرٹی میں ایک مشترکہ Name وسائل.ریسکس کلید منسلک اور اختصاص کریں۔

ان پٹ توثیق کے دوران نقص پیغامات پر اطلاق کرنے کے ErrorMessage لیے، ہر توثیق وصف کی خصوصیت میں ایک مشترکہ وسائل.ریسکس کلید کا اختصاص کریں۔

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 ہے۔ اگر آپ پیغام دیکھنا چاہتے ہیں، تو آپ کو پابندیاں ہٹانے کی ضرورت ہے، جیسے کہ آپ کے ویب براؤزر کے ڈویلپر ٹولز میں۔

ویسے، آپ کی عمر، تاریخ وغیرہ خالی رجسٹر کرتے وقت کچھ پیغامات دکھائے جاتے ہیں۔ یہ ایک پیغام ہے جو فریم ورک سائیڈ پر قائم کیا گیا ہے، لیکن ایک اور تجاویز آپ کو دکھائے گی کہ متعدد زبانوں میں اس کی حمایت کیسے کی جائے۔

تمام رموز کے لیے

یہ تجاویز صرف کچھ خصوصیات پر مشتمل ہیں، لیکن نمونہ ضابطہ تمام ایچ ٹی ایم ایل 5 فعال ان پٹ میدانوں کا احاطہ کرتا ہے۔ اگر آپ چیک کرنا چاہتے ہیں تو براہ کرم صفحہ کے اوپر موجود لنک ملاحظہ کریں۔

ذیل میں جزوی طور پر درج

صارف منظر ماڈل.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()));
  }
}

تخلیق کریں.سی ایس ایچ ٹی ایم ایل

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