[英]Blazor Change Validation default CSS class names
我正在嘗試 Microsoft Blazor,在使用 forms 和驗證時,我停止了如何更改默認值 CSS class,默認情況下將在InputText
驗證 State 上添加。
For Explanation when InputText
has an error by default take class " invalid
" 我想把這個 class 改成 " is-invalid
"
我需要最佳實踐。
謝謝,StackOverflow 社區
包括 class 在內的任何 HTML 元素(或 InputText)屬性都可以“單向”綁定到變量或表達式。 所以在你的情況下,你可以這樣做:
<input type="text" class="@((any_validation_condition)? "error_css_class" : "")" />
或者只是綁定到一個變量並在運行時設置該變量以反映元素的合適顯示 class。
謝謝
Blazor 已任意選擇invalid
作為 css class 用於基於InputBase<T>
的項目驗證,如InputText
。 但是,您可以創建一個新控件,例如MyInputText.razor
繼承這些控件,並創建自己的控件並放置中間代碼。
在這種情況下,您可以字符串替換(但在前面加上空格字符!) CssClass
屬性替換invalid
的is-invalid
和/或valid
的is-valid
。 您可以制作一個輔助方法或簡單地內聯:
@inherits Microsoft.AspNetCore.Components.Forms.InputText
<input @attributes="@AdditionalAttributes" class="@CssClass.Replace(" valid", " is-valid").Replace(" invalid", " is-invalid")" @bind="@CurrentValueAsString" />
並像使用普通InputText
一樣使用它:
<MyInputText @bind-Value="yourModel.Foo" class="form-control" />
是的,它在 Core 5.0 中是可定制的,但給出的示例不能按原樣工作。 方法HandleSubmit
必須將EditContext
作為參數,並在那里設置自定義FieldCssClassProvider
,而不是像示例中那樣在OnInitialized()
中設置。
private async Task HandleSubmit(EditContext context)
{
context.SetFieldCssClassProvider(new MyFieldClassProvider());
var isValid = context.Validate();
if (isValid)
{
//...
}
else
{
//...
}
我的MyFieldClassProvider()
返回“ is-valid
”和“ is-invalid
”,這適用於 Bootstrap。
現在可以自定義,請參見此處: https://docs.microsoft.com/en-us/aspnet/core/blazor/forms-validation?view=aspnetcore-5.0#custom-validation-class-attributes
var editContext = new EditContext(model);
editContext.SetFieldCssClassProvider(new MyFieldClassProvider());
...
private class MyFieldClassProvider : FieldCssClassProvider
{
public override string GetFieldCssClass(EditContext editContext,
in FieldIdentifier fieldIdentifier)
{
var isValid = !editContext.GetValidationMessages(fieldIdentifier).Any();
return isValid ? "good field" : "bad field";
}
}
As an addition to @user774031 answer: Blazor Framework Adds an Id to Isolated css class to make them scoped to Razor component but since this Id attribute added on Runtime, they do not add to child InputComponent and so the css class defined using css isolation do不適用,我們應該在全球范圍內定義它們。 為了使它們作為獨立的 css class 定義它們,例如: 1- 定義 a.Net class,它繼承自FieldCssClassProvider
並覆蓋其GetFieldCssClass
方法。 此方法應從editcontext
和fieldIdentifier
object 返回一些string
作為類名。
public class MyCustomeCSSProvider : FieldCssClassProvider
{
public override string GetFieldCssClass(EditContext editContext, in FieldIdentifier fieldIdentifier)
{
string className = string.Empty;
if (editContext.IsModified(fieldIdentifier))
{
className += " modifiedField";
}
if (editContext.GetValidationMessages(fieldIdentifier).Any())
{
className += " invalidField";
}
else
{
className += " validField";
}
return className;
}
}
2- 在OnInitialized
生命周期中使用擴展方法為編輯上下文設置 CssClassProvider:
_context = new EditContext(student);
_context.SetFieldCssClassProvider(new MyCustomeCSSProvider());
3- 使用::deep
將您的 class 定義在隔離的 css 文件中,如下所示:
::deep .validField {
border-color: lawngreen;
}
::deep .invalidField {
background-color: tomato;
}
::deep .modifiedField {
border: yellow dashed 2px;
}
在這個聚會上有點晚了,但為了自己設置驗證消息的樣式,我這樣做了:
<div class="text-danger mt-2">
<ValidationMessage For="()=>_model.Field" ></ValidationMessage>
</div>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.