ASP.NET Core formlardaki Yardımcıları etiketleme
Rick Anderson, N. Taylor Mullen, Dave Paquette ve Jerrie Pelser tarafından
Bu belgede Formlar ve Bir Formda yaygın olarak kullanılan HTML öğeleriyle çalışma gösterilmektedir. HTML Formu öğesi, web uygulamalarının verileri sunucuya geri göndermek için kullandığı birincil mekanizmayı sağlar. Bu belgenin çoğunda Etiket Yardımcıları ve bunların verimli bir şekilde güçlü HTML formları oluşturmanıza nasıl yardımcı olabileceği açıklanır. Bu belgeyi okumadan önce Etiket Yardımcılarına Giriş'i okumanızı öneririz.
Çoğu durumda, HTML Yardımcıları belirli bir Etiket Yardımcısı'na alternatif bir yaklaşım sunar, ancak Etiket Yardımcılarının HTML Yardımcılarının yerini almadığını ve her HTML Yardımcısı için bir Etiket Yardımcısı olmadığını bilmek önemlidir. BIR HTML Yardımcısı alternatifi mevcut olduğunda, bu seçenek belirtilir.
Form Etiketi Yardımcısı
MVC denetleyicisi eylemi veya adlandırılmış yol için HTML <FORM>
action
öznitelik değerini oluştururSiteler arası istek sahteciliğini önlemek için gizli bir İstek Doğrulama Belirteci oluşturur (HTTP Post eylem yönteminde özniteliğiyle
[ValidateAntiForgeryToken]
kullanıldığında)Yol değerlerine
asp-route-<Parameter Name>
eklendiği özniteliğini<Parameter Name>
sağlar.routeValues
ve parametreleriHtml.BeginForm
Html.BeginRouteForm
benzer işlevler sağlar.Bir HTML Yardımcısı alternatifi
Html.BeginForm
vardır veHtml.BeginRouteForm
Örnek:
<form asp-controller="Demo" asp-action="Register" method="post">
<!-- Input and Submit elements -->
</form>
Yukarıdaki Form Etiketi Yardımcısı aşağıdaki HTML'yi oluşturur:
<form method="post" action="/Demo/Register">
<!-- Input and Submit elements -->
<input name="__RequestVerificationToken" type="hidden" value="<removed for brevity>">
</form>
MVC çalışma zamanı, ve Form Etiketi Yardımcısı özniteliklerinden asp-controller
asp-action
öznitelik değerini oluştururaction
. Form Etiketi Yardımcısı ayrıca siteler arası istek sahteciliğini önlemek için gizli bir İstek Doğrulama Belirteci oluşturur (HTTP Post eylem yönteminde özniteliğiyle [ValidateAntiForgeryToken]
kullanıldığında). Saf BIR HTML Formunu siteler arası istek sahteciliğinden korumak zordur, Form Etiketi Yardımcısı bu hizmeti sizin için sağlar.
Adlandırılmış yol kullanma
asp-route
Etiket Yardımcısı özniteliği, HTML action
özniteliği için işaretleme de oluşturabilir. Rotası adlı register
bir uygulama kayıt sayfası için aşağıdaki işaretlemeyi kullanabilir:
<form asp-route="register" method="post">
<!-- Input and Submit elements -->
</form>
Görünümler/Hesap klasöründeki görünümlerin çoğu (Bireysel Kullanıcı Hesapları ile yeni bir web uygulaması oluşturduğunuzda oluşturulur) asp-route-returnurl özniteliğini içerir:
<form asp-controller="Account" asp-action="Login"
asp-route-returnurl="@ViewData["ReturnUrl"]"
method="post" class="form-horizontal" role="form">
Not
Yerleşik şablonlarla, returnUrl
yalnızca yetkili bir kaynağa erişmeye çalıştığınızda otomatik olarak doldurulur, ancak kimliği doğrulanmaz veya yetkilendirilmemiş olur. Yetkisiz erişim denediğinizde, güvenlik ara yazılımı sizi kümeyle oturum returnUrl
açma sayfasına yönlendirir.
Form Eylem Etiketi Yardımcısı
Form Eylem Etiketi Yardımcısı, oluşturulan <button ...>
veya <input type="image" ...>
etiketinde özniteliğini oluştururformaction
. özniteliği, formun formaction
verilerini nereye gönderdiğini denetler. Tür image
ve <düğme> öğelerinin giriş> öğelerine< bağlanır. Form Eylem Etiketi Yardımcısı, karşılık gelen öğe için hangi formaction
bağlantının oluşturulduğunu denetlemek için birkaç AnchorTagHelperasp-
özniteliğinin kullanımını sağlar.
değerini formaction
denetlemek için Desteklenen AnchorTagHelper öznitelikleri:
Öznitelik | Açıklama |
---|---|
asp-controller | Denetleyicinin adı. |
asp-action | Eylem yönteminin adı. |
asp-area | Alanın adı. |
asp-page | Sayfanın adı Razor . |
asp-page-handler | Sayfa işleyicisinin Razor adı. |
asp-route | Yolun adı. |
asp-route-{value} | Tek bir URL yol değeri. Örneğin, asp-route-id="1234" . |
asp-all-route-data | Tüm yol değerleri. |
asp-fragment | URL parçası. |
Denetleyiciye gönder örneği
Aşağıdaki işaretleme, formu Index
giriş veya düğme seçildiğinde eylemine HomeController
gönderir:
<form method="post">
<button asp-controller="Home" asp-action="Index">Click Me</button>
<input type="image" src="..." alt="Or Click Me" asp-controller="Home"
asp-action="Index">
</form>
Önceki işaretleme aşağıdaki HTML'yi oluşturur:
<form method="post">
<button formaction="/Home">Click Me</button>
<input type="image" src="..." alt="Or Click Me" formaction="/Home">
</form>
Sayfaya gönder örneği
Aşağıdaki işaretleme formu Sayfaya About
Razor gönderir:
<form method="post">
<button asp-page="About">Click Me</button>
<input type="image" src="..." alt="Or Click Me" asp-page="About">
</form>
Önceki işaretleme aşağıdaki HTML'yi oluşturur:
<form method="post">
<button formaction="/About">Click Me</button>
<input type="image" src="..." alt="Or Click Me" formaction="/About">
</form>
Yol örneğine gönder
/Home/Test
Uç noktayı göz önünde bulundurun:
public class HomeController : Controller
{
[Route("/Home/Test", Name = "Custom")]
public string Test()
{
return "This is the test page";
}
}
Aşağıdaki işaretleme formu /Home/Test
uç noktaya gönderir.
<form method="post">
<button asp-route="Custom">Click Me</button>
<input type="image" src="..." alt="Or Click Me" asp-route="Custom">
</form>
Önceki işaretleme aşağıdaki HTML'yi oluşturur:
<form method="post">
<button formaction="/Home/Test">Click Me</button>
<input type="image" src="..." alt="Or Click Me" formaction="/Home/Test">
</form>
Giriş Etiketi Yardımcısı
Giriş Etiketi Yardımcısı, razor görünümünüzde bir HTML <giriş> öğesini bir model ifadesine bağlar.
Söz dizimi:
<input asp-for="<Expression Name>">
Giriş Etiketi Yardımcısı:
özniteliğinde
id
belirtilenasp-for
ifade adı için vename
HTML özniteliklerini oluşturur.asp-for="Property1.Property2"
,m => m.Property1.Property2
ile eşdeğerdir. İfadenin adı, öznitelik değeri içinasp-for
kullanılan addır. Ek bilgi için İfade adları bölümüne bakın.MODEL özelliğine uygulanan model türüne ve veri ek açıklaması özniteliklerine göre HTML
type
öznitelik değerini ayarlarBelirtildiğinde HTML
type
öznitelik değerinin üzerine yazılmıyorModel özelliklerine uygulanan veri ek açıklaması özniteliklerinden HTML5 doğrulama öznitelikleri oluşturur
ve
Html.EditorFor
ileHtml.TextBoxFor
çakışan bir HTML Yardımcısı özelliği vardır. Ayrıntılar için Giriş Etiketi Yardımcısı'nın HTML Yardımcısı alternatifleri bölümüne bakın.Güçlü yazma sağlar. Özelliğin adı değişirse ve Etiket Yardımcısı'nı güncelleştirmezseniz aşağıdakine benzer bir hata alırsınız:
An error occurred during the compilation of a resource required to process this request. Please review the following specific error details and modify your source code appropriately. Type expected 'RegisterViewModel' does not contain a definition for 'Email' and no extension method 'Email' accepting a first argument of type 'RegisterViewModel' could be found (are you missing a using directive or an assembly reference?)
Input
Etiket Yardımcısı HTML type
özniteliğini .NET türüne göre ayarlar. Aşağıdaki tabloda bazı yaygın .NET türleri ve oluşturulan HTML türleri listelenmiştir (her .NET türü listelenmez).
.NET türü | Giriş Türü |
---|---|
Bool | type="onay kutusu" |
Dize | type="text" |
DateTime | type="datetime-local" |
Bayt | type="number" |
int | type="number" |
Tek, Çift | type="number" |
Aşağıdaki tabloda, giriş etiketi yardımcısının belirli giriş türleriyle eşlenecek bazı yaygın veri ek açıklamaları öznitelikleri gösterilmektedir (her doğrulama özniteliği listelenmez):
Öznitelik | Giriş Türü |
---|---|
[EmailAddress] | type="email" |
[Url] | type="url" |
[HiddenInput] | type="hidden" |
[Telefon] | type="tel" |
[DataType(DataType.Password)] | type="password" |
[DataType(DataType.Date)] | type="date" |
[DataType(DataType.Time)] | type="time" |
Örnek:
using System.ComponentModel.DataAnnotations;
namespace FormsTagHelper.ViewModels
{
public class RegisterViewModel
{
[Required]
[EmailAddress]
[Display(Name = "Email Address")]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
}
}
@model RegisterViewModel
<form asp-controller="Demo" asp-action="RegisterInput" method="post">
Email: <input asp-for="Email" /> <br />
Password: <input asp-for="Password" /><br />
<button type="submit">Register</button>
</form>
Yukarıdaki kod aşağıdaki HTML'yi oluşturur:
<form method="post" action="/Demo/RegisterInput">
Email:
<input type="email" data-val="true"
data-val-email="The Email Address field is not a valid email address."
data-val-required="The Email Address field is required."
id="Email" name="Email" value=""><br>
Password:
<input type="password" data-val="true"
data-val-required="The Password field is required."
id="Password" name="Password"><br>
<button type="submit">Register</button>
<input name="__RequestVerificationToken" type="hidden" value="<removed for brevity>">
</form>
ve Password
özelliklerine Email
uygulanan veri ek açıklamaları modelde meta veriler oluşturur. Giriş Etiketi Yardımcısı model meta verilerini kullanır ve HTML5data-val-*
öznitelikleri üretir (bkz. Model Doğrulama). Bu öznitelikler, giriş alanlarına eklenecek doğrulayıcıları açıklar. Bu, engelleyici olmayan HTML5 ve jQuery doğrulaması sağlar. Göze çarpmayan öznitelikler biçimindedirdata-val-rule="Error Message"
; burada kural geçerlilik kuralının adıdır (, data-val-required
data-val-email
, , data-val-maxlength
vb.) Özniteliğinde bir hata iletisi sağlanırsa, bu ileti özniteliğin data-val-rule
değeri olarak görüntülenir. Kural hakkında ek ayrıntılar sağlayan formun data-val-ruleName-argumentName="argumentValue"
öznitelikleri de vardır, örneğin, data-val-maxlength-max="1024"
.
Birden çok input
denetimi aynı özelliğe bağlarken, oluşturulan denetimler aynı id
öğesini paylaşır ve bu da oluşturulan işaretlemenin geçersiz olmasını sağlar. Yinelenenleri önlemek için her denetimin id
özniteliğini açıkça belirtin.
Onay kutusu gizli giriş işleme
HTML5'teki onay kutuları, işaretsiz olduklarında değer göndermez. İşaretlenmemiş bir onay kutusu için varsayılan bir değerin gönderilmesini etkinleştirmek için, Giriş Etiketi Yardımcısı onay kutuları için ek bir gizli giriş oluşturur.
Örneğin, bir boole modeli özelliği IsChecked
için Giriş Etiketi Yardımcısı'nı kullanan aşağıdaki Razor işaretlemeyi göz önünde bulundurun:
<form method="post">
<input asp-for="@Model.IsChecked" />
<button type="submit">Submit</button>
</form>
Yukarıdaki Razor işaretleme, aşağıdakine benzer bir HTML işaretlemesi oluşturur:
<form method="post">
<input name="IsChecked" type="checkbox" value="true" />
<button type="submit">Submit</button>
<input name="IsChecked" type="hidden" value="false" />
</form>
Yukarıdaki HTML işaretlemesi, adı IsChecked
ve değeri false
olan ek bir gizli girişi gösterir. Varsayılan olarak, bu gizli giriş formun sonunda işlenir. Form gönderildiğinde:
IsChecked
Onay kutusu girişi işaretliyse, hemfalse
hem detrue
değer olarak gönderilir.- Onay kutusu girişinin
IsChecked
işareti kaldırılırsa, yalnızca gizli giriş değerifalse
gönderilir.
ASP.NET Core model bağlama işlemi, bir bool
değere bağlanırken yalnızca ilk değeri okur ve bu da işaretli onay kutularına ve false
işaretlenmemiş onay kutularına neden true
olur.
Gizli giriş işleme davranışını yapılandırmak için özelliğini üzerinde MvcViewOptions.HtmlHelperOptionsayarlayınCheckBoxHiddenInputRenderMode. Örnek:
services.Configure<MvcViewOptions>(options =>
options.HtmlHelperOptions.CheckBoxHiddenInputRenderMode =
CheckBoxHiddenInputRenderMode.None);
Yukarıdaki kod, olarak ayarlayarak CheckBoxHiddenInputRenderMode
onay kutuları için gizli giriş işlemeyi CheckBoxHiddenInputRenderMode.Nonedevre dışı bırakır. Tüm kullanılabilir işleme modları için numaralandırmaya CheckBoxHiddenInputRenderMode bakın.
Giriş Etiketi Yardımcısı için HTML Yardımcısı alternatifleri
Html.TextBox
, Html.TextBoxFor
Html.Editor
ve Html.EditorFor
Giriş Etiketi Yardımcısı ile çakışan özelliklere sahiptir. Giriş Etiketi Yardımcısı özniteliği Html.TextBox
otomatik olarak ayarlar ve Html.TextBoxFor
ayarlamaztype
. Html.Editor
ve Html.EditorFor
koleksiyonları, karmaşık nesneleri ve şablonları işler; Giriş Etiketi Yardımcısı bunu yapmaz. Giriş Etiketi Yardımcısı Html.EditorFor
ve Html.TextBoxFor
türü kesin olarak belirlenmiştir (lambda ifadeleri kullanırlar); Html.TextBox
Html.Editor
değildir (ifade adlarını kullanırlar).
HtmlAttributes
@Html.Editor()
ve @Html.EditorFor()
varsayılan şablonlarını yürütürken adlı htmlAttributes
özel ViewDataDictionary
bir giriş kullanın. Bu davranış isteğe bağlı olarak parametreler kullanılarak additionalViewData
artırılır. "htmlAttributes" anahtarı büyük/küçük harfe duyarlı değildir. "htmlAttributes" anahtarı, gibi @Html.TextBox()
giriş yardımcılarına geçirilen nesneye benzer şekilde htmlAttributes
işlenir.
@Html.EditorFor(model => model.YourProperty,
new { htmlAttributes = new { @class="myCssClass", style="Width:100px" } })
İfade adları
asp-for
Öznitelik değeri, lambda ModelExpression
ifadesinin bir ve sağ tarafıdır. Bu nedenle, asp-for="Property1"
oluşturulan kodda olur m => m.Property1
ve bu nedenle ön ekini eklemeniz Model
gerekmez. Satır içi ifade başlatmak ve öncesinde m.
hareket etmek için "@" karakterini kullanabilirsiniz:
@{
var joe = "Joe";
}
<input asp-for="@joe">
Aşağıdakileri oluşturur:
<input type="text" id="joe" name="joe" value="Joe">
Koleksiyon özellikleriyle, asp-for="CollectionProperty[23].Member"
değerine 23
sahip olduğunda i
ile aynı adı asp-for="CollectionProperty[i].Member"
oluşturur.
ASP.NET Core MVC değerini ModelExpression
hesapladığında, dahil olmak üzere ModelState
çeşitli kaynakları inceler. göz önünde bulundurun <input type="text" asp-for="Name">
. Hesaplanan value
öznitelik, aşağıdakilerden ilk null olmayan değerdir:
ModelState
girdisi ve "Ad" anahtarı.- ifadesinin
Model.Name
sonucu.
Alt özelliklerde gezinme
Görünüm modelinin özellik yolunu kullanarak alt özelliklere de gidebilirsiniz. Alt Address
özellik içeren daha karmaşık bir model sınıfını düşünün.
public class AddressViewModel
{
public string AddressLine1 { get; set; }
}
public class RegisterAddressViewModel
{
public string Email { get; set; }
[DataType(DataType.Password)]
public string Password { get; set; }
public AddressViewModel Address { get; set; }
}
Görünümde öğesine Address.AddressLine1
bağlanıyoruz:
@model RegisterAddressViewModel
<form asp-controller="Demo" asp-action="RegisterAddress" method="post">
Email: <input asp-for="Email" /> <br />
Password: <input asp-for="Password" /><br />
Address: <input asp-for="Address.AddressLine1" /><br />
<button type="submit">Register</button>
</form>
için Address.AddressLine1
aşağıdaki HTML oluşturulur:
<input type="text" id="Address_AddressLine1" name="Address.AddressLine1" value="">
İfade adları ve Koleksiyonlar
Örnek, dizisini içeren bir model:Colors
public class Person
{
public List<string> Colors { get; set; }
public int Age { get; set; }
}
Eylem yöntemi:
public IActionResult Edit(int id, int colorIndex)
{
ViewData["Index"] = colorIndex;
return View(GetPerson(id));
}
Aşağıda Razor belirli Color
bir öğeye nasıl erişdiğiniz gösterilmektedir:
@model Person
@{
var index = (int)ViewData["index"];
}
<form asp-controller="ToDo" asp-action="Edit" method="post">
@Html.EditorFor(m => m.Colors[index])
<label asp-for="Age"></label>
<input asp-for="Age" /><br />
<button type="submit">Post</button>
</form>
Şablon Views/Shared/EditorTemplates/String.cshtml
:
@model string
<label asp-for="@Model"></label>
<input asp-for="@Model" /> <br />
kullanan List<T>
örnek:
public class ToDoItem
{
public string Name { get; set; }
public bool IsDone { get; set; }
}
Aşağıda Razor bir koleksiyon üzerinde nasıl yineleme yapılacağını gösterilmektedir:
@model List<ToDoItem>
<form asp-controller="ToDo" asp-action="Edit" method="post">
<table>
<tr> <th>Name</th> <th>Is Done</th> </tr>
@for (int i = 0; i < Model.Count; i++)
{
<tr>
@Html.EditorFor(model => model[i])
</tr>
}
</table>
<button type="submit">Save</button>
</form>
Şablon Views/Shared/EditorTemplates/ToDoItem.cshtml
:
@model ToDoItem
<td>
<label asp-for="@Model.Name"></label>
@Html.DisplayFor(model => model.Name)
</td>
<td>
<input asp-for="@Model.IsDone" />
</td>
@*
This template replaces the following Razor which evaluates the indexer three times.
<td>
<label asp-for="@Model[i].Name"></label>
@Html.DisplayFor(model => model[i].Name)
</td>
<td>
<input asp-for="@Model[i].IsDone" />
</td>
*@
foreach
mümkünse değer veya Html.DisplayFor
eşdeğer bir asp-for
bağlamda kullanılacaksa kullanılmalıdır. Genel olarak, for
bir numaralandırıcı ayırması gerekmediğinden (senaryo izin veriyorsa) değerinden daha iyidir foreach
; bununla birlikte, LINQ ifadesindeki bir dizin oluşturucuyu değerlendirmek pahalı olabilir ve simge durumuna küçültülmelidir.
Not
Yukarıdaki açıklamalı örnek kod, listedeki her ToDoItem
birine erişmek için lambda ifadesini işleciyle @
nasıl değiştireceğini gösterir.
Textarea Etiket Yardımcısı
Etiket Textarea Tag Helper
yardımcısı, Giriş Etiketi Yardımcısı'na benzer.
id
Bir <textarea> öğesi için modelden vename
özniteliklerini ve veri doğrulama özniteliklerini oluşturur.Güçlü yazma sağlar.
HTML Yardımcısı alternatifi:
Html.TextAreaFor
Örnek:
using System.ComponentModel.DataAnnotations;
namespace FormsTagHelper.ViewModels
{
public class DescriptionViewModel
{
[MinLength(5)]
[MaxLength(1024)]
public string Description { get; set; }
}
}
@model DescriptionViewModel
<form asp-controller="Demo" asp-action="RegisterTextArea" method="post">
<textarea asp-for="Description"></textarea>
<button type="submit">Test</button>
</form>
Aşağıdaki HTML oluşturulur:
<form method="post" action="/Demo/RegisterTextArea">
<textarea data-val="true"
data-val-maxlength="The field Description must be a string or array type with a maximum length of '1024'."
data-val-maxlength-max="1024"
data-val-minlength="The field Description must be a string or array type with a minimum length of '5'."
data-val-minlength-min="5"
id="Description" name="Description">
</textarea>
<button type="submit">Test</button>
<input name="__RequestVerificationToken" type="hidden" value="<removed for brevity>">
</form>
Etiket Etiketi Yardımcısı
bir ifade adı için etiket <öğesinde etiket> başlığını ve
for
özniteliğini oluştururHTML Yardımcısı alternatifi:
Html.LabelFor
.
, Label Tag Helper
bir saf HTML etiket öğesi üzerinde aşağıdaki avantajları sağlar:
Açıklayıcı etiket değerini özniteliğinden
Display
otomatik olarak alırsınız. Hedeflenen görünen ad zaman içinde değişebilir ve özniteliğin ve Etiket Etiketi Yardımcısı'nınDisplay
birleşimi kullanıldığı her yere uygulanırDisplay
.Kaynak kodunda daha az işaretleme
Model özelliğiyle güçlü yazma.
Örnek:
using System.ComponentModel.DataAnnotations;
namespace FormsTagHelper.ViewModels
{
public class SimpleViewModel
{
[Required]
[EmailAddress]
[Display(Name = "Email Address")]
public string Email { get; set; }
}
}
@model SimpleViewModel
<form asp-controller="Demo" asp-action="RegisterLabel" method="post">
<label asp-for="Email"></label>
<input asp-for="Email" /> <br />
</form>
öğesi için <label>
aşağıdaki HTML oluşturulur:
<label for="Email">Email Address</label>
Etiket Etiketi Yardımcısı, öğesiyle <input>
ilişkilendirilmiş kimlik olan "Email" öznitelik değerini oluşturdufor
. Etiket Yardımcıları, doğru şekilde ilişkilendirilebilmeleri için tutarlı id
ve for
öğeler oluşturur. Bu örnekteki resim yazısı özniteliğinden Display
gelir. Model bir Display
öznitelik içermiyorsa, açıklamalı alt yazı ifadenin özellik adı olacaktır. Varsayılan resim yazısını geçersiz kılmak için etiket etiketinin içine bir resim yazısı ekleyin.
Doğrulama Etiketi Yardımcıları
İki Doğrulama Etiketi Yardımcısı vardır. Validation Message Tag Helper
(modelinizdeki tek bir özelliğin doğrulama iletisini görüntüler) ve Validation Summary Tag Helper
(doğrulama hatalarının özetini görüntüler). , Input Tag Helper
model sınıflarınızdaki veri ek açıklaması özniteliklerine göre giriş öğelerine HTML5 istemci tarafı doğrulama öznitelikleri ekler. Doğrulama sunucuda da gerçekleştirilir. Doğrulama Etiketi Yardımcısı bir doğrulama hatası oluştuğunda bu hata iletilerini görüntüler.
Doğrulama İletisi Etiketi Yardımcısı
Belirtilen model özelliğinin giriş alanına doğrulama hata iletilerini ekleyen span öğesine HTML5
data-valmsg-for="property"
özniteliğini ekler. İstemci tarafı doğrulama hatası oluştuğunda , jQuery öğesinde<span>
hata iletisini görüntüler.Doğrulama sunucuda da gerçekleşir. İstemcilerde JavaScript devre dışı bırakılmış olabilir ve bazı doğrulamalar yalnızca sunucu tarafında gerçekleştirilebilir.
HTML Yardımcısı alternatifi:
Html.ValidationMessageFor
Validation Message Tag Helper
bir HTML span öğesinde özniteliğiyle asp-validation-for
birlikte kullanılır.
<span asp-validation-for="Email"></span>
Doğrulama İletisi Etiketi Yardımcısı aşağıdaki HTML'yi oluşturur:
<span class="field-validation-valid"
data-valmsg-for="Email"
data-valmsg-replace="true"></span>
Aynı özellik için genellikle after a Input
Tag Yardımcısı'nı kullanırsınızValidation Message Tag Helper
. Bunu yaptığınızda, hataya neden olan girişin yakınında doğrulama hata iletileri görüntülenir.
Not
İstemci tarafı doğrulaması için doğru JavaScript ve jQuery betik başvurularını içeren bir görünüme sahip olmanız gerekir. Daha fazla bilgi için bkz. Model Doğrulama .
Bir sunucu tarafı doğrulama hatası oluştuğunda (örneğin, özel sunucu tarafı doğrulamanız varsa veya istemci tarafı doğrulama devre dışı bırakıldığında), MVC bu hata iletisini öğenin gövdesi <span>
olarak yerleştirir.
<span class="field-validation-error" data-valmsg-for="Email"
data-valmsg-replace="true">
The Email Address field is required.
</span>
Doğrulama Özeti Etiketi Yardımcısı
özniteliğine sahip
asp-validation-summary
öğeleri hedefler<div>
HTML Yardımcısı alternatifi:
@Html.ValidationSummary
Validation Summary Tag Helper
, doğrulama iletilerinin özetini görüntülemek için kullanılır. Öznitelik asp-validation-summary
değeri aşağıdakilerden biri olabilir:
asp-validation-summary | Görüntülenen doğrulama iletileri |
---|---|
All |
Özellik ve model düzeyi |
ModelOnly |
Modelleme |
None |
Hiçbiri |
Örnek
Aşağıdaki örnekte, veri modelinin öğesinde <input>
doğrulama hata iletileri oluşturan öznitelikleri vardırDataAnnotation
. Doğrulama hatası oluştuğunda Doğrulama Etiketi Yardımcısı şu hata iletisini görüntüler:
using System.ComponentModel.DataAnnotations;
namespace FormsTagHelper.ViewModels
{
public class RegisterViewModel
{
[Required]
[EmailAddress]
[Display(Name = "Email Address")]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
}
}
@model RegisterViewModel
<form asp-controller="Demo" asp-action="RegisterValidation" method="post">
<div asp-validation-summary="ModelOnly"></div>
Email: <input asp-for="Email" /> <br />
<span asp-validation-for="Email"></span><br />
Password: <input asp-for="Password" /><br />
<span asp-validation-for="Password"></span><br />
<button type="submit">Register</button>
</form>
Oluşturulan HTML (model geçerli olduğunda):
<form action="/DemoReg/Register" method="post">
Email: <input name="Email" id="Email" type="email" value=""
data-val-required="The Email field is required."
data-val-email="The Email field is not a valid email address."
data-val="true"><br>
<span class="field-validation-valid" data-valmsg-replace="true"
data-valmsg-for="Email"></span><br>
Password: <input name="Password" id="Password" type="password"
data-val-required="The Password field is required." data-val="true"><br>
<span class="field-validation-valid" data-valmsg-replace="true"
data-valmsg-for="Password"></span><br>
<button type="submit">Register</button>
<input name="__RequestVerificationToken" type="hidden" value="<removed for brevity>">
</form>
Etiket Yardımcısı Seç
Modelinizin özellikleri için seçme ve ilişkili seçenek öğeleri oluşturur.
Bir HTML Yardımcısı alternatifi
Html.DropDownListFor
vardır veHtml.ListBoxFor
, Select Tag Helper
asp-for
select öğesinin model özellik adını ve asp-items
seçenek öğelerini belirtir. Örnek:
<select asp-for="Country" asp-items="Model.Countries"></select>
Örnek:
using Microsoft.AspNetCore.Mvc.Rendering;
using System.Collections.Generic;
namespace FormsTagHelper.ViewModels
{
public class CountryViewModel
{
public string Country { get; set; }
public List<SelectListItem> Countries { get; } = new List<SelectListItem>
{
new SelectListItem { Value = "MX", Text = "Mexico" },
new SelectListItem { Value = "CA", Text = "Canada" },
new SelectListItem { Value = "US", Text = "USA" },
};
}
}
Index
yöntemi, öğesini başlatırCountryViewModel
, seçili ülkeyi ayarlar ve görünüme Index
geçirir.
public IActionResult Index()
{
var model = new CountryViewModel();
model.Country = "CA";
return View(model);
}
HTTP POST Index
yöntemi şu seçimi görüntüler:
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Index(CountryViewModel model)
{
if (ModelState.IsValid)
{
var msg = model.Country + " selected";
return RedirectToAction("IndexSuccess", new { message = msg });
}
// If we got this far, something failed; redisplay form.
return View(model);
}
Görünüm Index
:
@model CountryViewModel
<form asp-controller="Home" asp-action="Index" method="post">
<select asp-for="Country" asp-items="Model.Countries"></select>
<br /><button type="submit">Register</button>
</form>
Bu, aşağıdaki HTML'yi oluşturur ("CA" seçili durumda):
<form method="post" action="/">
<select id="Country" name="Country">
<option value="MX">Mexico</option>
<option selected="selected" value="CA">Canada</option>
<option value="US">USA</option>
</select>
<br /><button type="submit">Register</button>
<input name="__RequestVerificationToken" type="hidden" value="<removed for brevity>">
</form>
Not
Etiket Seçin Yardımcısı ile veya ViewData
kullanılmasını ViewBag
önermiyoruz. Görünüm modeli, MVC meta verileri sağlama konusunda daha güçlüdür ve genellikle daha az sorunludur.
Öznitelik asp-for
değeri özel bir durumdur ve ön Model
ek gerektirmez, diğer Etiket Yardımcısı öznitelikleri bunu yapar (örneğin asp-items
)
<select asp-for="Country" asp-items="Model.Countries"></select>
Sabit listesi bağlama
Genellikle bir enum
özellik ile kullanmak <select>
ve değerlerden enum
öğeleri oluşturmak SelectListItem
uygundur.
Örnek:
public class CountryEnumViewModel
{
public CountryEnum EnumCountry { get; set; }
}
}
using System.ComponentModel.DataAnnotations;
namespace FormsTagHelper.ViewModels
{
public enum CountryEnum
{
[Display(Name = "United Mexican States")]
Mexico,
[Display(Name = "United States of America")]
USA,
Canada,
France,
Germany,
Spain
}
}
yöntemi bir GetEnumSelectList
sabit listesi için bir SelectList
nesne oluşturur.
@model CountryEnumViewModel
<form asp-controller="Home" asp-action="IndexEnum" method="post">
<select asp-for="EnumCountry"
asp-items="Html.GetEnumSelectList<CountryEnum>()">
</select>
<br /><button type="submit">Register</button>
</form>
Daha zengin bir kullanıcı arabirimi elde etmek için numaralandırıcı listenizi özniteliğiyle Display
işaretleyebilirsiniz:
using System.ComponentModel.DataAnnotations;
namespace FormsTagHelper.ViewModels
{
public enum CountryEnum
{
[Display(Name = "United Mexican States")]
Mexico,
[Display(Name = "United States of America")]
USA,
Canada,
France,
Germany,
Spain
}
}
Aşağıdaki HTML oluşturulur:
<form method="post" action="/Home/IndexEnum">
<select data-val="true" data-val-required="The EnumCountry field is required."
id="EnumCountry" name="EnumCountry">
<option value="0">United Mexican States</option>
<option value="1">United States of America</option>
<option value="2">Canada</option>
<option value="3">France</option>
<option value="4">Germany</option>
<option selected="selected" value="5">Spain</option>
</select>
<br /><button type="submit">Register</button>
<input name="__RequestVerificationToken" type="hidden" value="<removed for brevity>">
</form>
Seçenek Grubu
GÖRÜNÜM modeli bir veya daha fazla SelectListGroup
nesne içerdiğinde HTML <optgroup> öğesi oluşturulur.
SelectListItem
Öğeleri CountryViewModelGroup
"Kuzey Amerika" ve "Avrupa" gruplarına ayırır:
public class CountryViewModelGroup
{
public CountryViewModelGroup()
{
var NorthAmericaGroup = new SelectListGroup { Name = "North America" };
var EuropeGroup = new SelectListGroup { Name = "Europe" };
Countries = new List<SelectListItem>
{
new SelectListItem
{
Value = "MEX",
Text = "Mexico",
Group = NorthAmericaGroup
},
new SelectListItem
{
Value = "CAN",
Text = "Canada",
Group = NorthAmericaGroup
},
new SelectListItem
{
Value = "US",
Text = "USA",
Group = NorthAmericaGroup
},
new SelectListItem
{
Value = "FR",
Text = "France",
Group = EuropeGroup
},
new SelectListItem
{
Value = "ES",
Text = "Spain",
Group = EuropeGroup
},
new SelectListItem
{
Value = "DE",
Text = "Germany",
Group = EuropeGroup
}
};
}
public string Country { get; set; }
public List<SelectListItem> Countries { get; }
İki grup aşağıda gösterilmiştir:
Oluşturulan HTML:
<form method="post" action="/Home/IndexGroup">
<select id="Country" name="Country">
<optgroup label="North America">
<option value="MEX">Mexico</option>
<option value="CAN">Canada</option>
<option value="US">USA</option>
</optgroup>
<optgroup label="Europe">
<option value="FR">France</option>
<option value="ES">Spain</option>
<option value="DE">Germany</option>
</optgroup>
</select>
<br /><button type="submit">Register</button>
<input name="__RequestVerificationToken" type="hidden" value="<removed for brevity>">
</form>
Birden çok seçim
Öznitelikte belirtilen özellik bir IEnumerable
ise, Etiket Seçin Yardımcısı otomatik olarak multiple = "multiple" özniteliğini asp-for
oluşturur. Örneğin, aşağıdaki modele göre:
using Microsoft.AspNetCore.Mvc.Rendering;
using System.Collections.Generic;
namespace FormsTagHelper.ViewModels
{
public class CountryViewModelIEnumerable
{
public IEnumerable<string> CountryCodes { get; set; }
public List<SelectListItem> Countries { get; } = new List<SelectListItem>
{
new SelectListItem { Value = "MX", Text = "Mexico" },
new SelectListItem { Value = "CA", Text = "Canada" },
new SelectListItem { Value = "US", Text = "USA" },
new SelectListItem { Value = "FR", Text = "France" },
new SelectListItem { Value = "ES", Text = "Spain" },
new SelectListItem { Value = "DE", Text = "Germany"}
};
}
}
Aşağıdaki görünümle:
@model CountryViewModelIEnumerable
<form asp-controller="Home" asp-action="IndexMultiSelect" method="post">
<select asp-for="CountryCodes" asp-items="Model.Countries"></select>
<br /><button type="submit">Register</button>
</form>
Aşağıdaki HTML'yi oluşturur:
<form method="post" action="/Home/IndexMultiSelect">
<select id="CountryCodes"
multiple="multiple"
name="CountryCodes"><option value="MX">Mexico</option>
<option value="CA">Canada</option>
<option value="US">USA</option>
<option value="FR">France</option>
<option value="ES">Spain</option>
<option value="DE">Germany</option>
</select>
<br /><button type="submit">Register</button>
<input name="__RequestVerificationToken" type="hidden" value="<removed for brevity>">
</form>
Seçim yok
Birden çok sayfada "belirtilmemiş" seçeneğini kullandığınızı fark ederseniz, HTML'nin yinelenmesini ortadan kaldırmak için bir şablon oluşturabilirsiniz:
@model CountryViewModel
<form asp-controller="Home" asp-action="IndexEmpty" method="post">
@Html.EditorForModel()
<br /><button type="submit">Register</button>
</form>
Şablon Views/Shared/EditorTemplates/CountryViewModel.cshtml
:
@model CountryViewModel
<select asp-for="Country" asp-items="Model.Countries">
<option value="">--none--</option>
</select>
HTML <seçenek> öğeleri eklemek , Seçim yok büyük/küçük harfle sınırlı değildir. Örneğin, aşağıdaki görünüm ve eylem yöntemi yukarıdaki koda benzer BIR HTML oluşturur:
public IActionResult IndexNone()
{
var model = new CountryViewModel();
model.Insert(0, new SelectListItem("<none>", ""));
return View(model);
}
@model CountryViewModel
<form asp-controller="Home" asp-action="IndexEmpty" method="post">
<select asp-for="Country">
<option value=""><none></option>
<option value="MX">Mexico</option>
<option value="CA">Canada</option>
<option value="US">USA</option>
</select>
<br /><button type="submit">Register</button>
</form>
Geçerli Country
değere bağlı olarak doğru <option>
öğe seçilir (özniteliği içerirselected="selected"
).
public IActionResult IndexOption(int id)
{
var model = new CountryViewModel();
model.Country = "CA";
return View(model);
}
<form method="post" action="/Home/IndexEmpty">
<select id="Country" name="Country">
<option value=""><none></option>
<option value="MX">Mexico</option>
<option value="CA" selected="selected">Canada</option>
<option value="US">USA</option>
</select>
<br /><button type="submit">Register</button>
<input name="__RequestVerificationToken" type="hidden" value="<removed for brevity>">
</form>