पैरामीटर नाम, इनपुट सत्यापन संदेश आदि के लिए उपयोग किए जाने वाले डेटाननोटेशन के लिए बहुभाषी समर्थन।
पर्यावरण
- 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");}
}