สนับสนุนการสนับสนุนหลายภาษาสําหรับการนําทางข้อมูลสําหรับชื่อพารามิเตอร์และป้อนข้อความการตรวจสอบความถูกต้อง
สภาพแวดล้อม
- 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");}
}