پیرامیٹر ناموں، ان پٹ توثیق پیغامات وغیرہ کے لیے استعمال ہونے والے ڈیٹا انوٹیشنز کے لیے کثیر لسانی معاونت۔
ماحول
- 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");}
}