C# ASP.NET Blazor需要使用InputSelect进行验证
我正在尝试获取使用InputSelect所需的属性,但在Blazor服务器中验证不起作用。可以提交表格而无需选择。有趣的是,当model属性为null时,它就可以工作。在.NET5.0之前,它不适用于可空类型,因为InputSelect不支持这些类型。但是,我需要一个不可为null的required属性,因为我希望将API中的dto作为模型重用,并且因为它在逻辑上是错误的 页面C# ASP.NET Blazor需要使用InputSelect进行验证,c#,asp.net,blazor,blazor-server-side,C#,Asp.net,Blazor,Blazor Server Side,我正在尝试获取使用InputSelect所需的属性,但在Blazor服务器中验证不起作用。可以提交表格而无需选择。有趣的是,当model属性为null时,它就可以工作。在.NET5.0之前,它不适用于可空类型,因为InputSelect不支持这些类型。但是,我需要一个不可为null的required属性,因为我希望将API中的dto作为模型重用,并且因为它在逻辑上是错误的 页面 @page "/testrequired" @using TestNET5BlazorServer
@page "/testrequired"
@using TestNET5BlazorServerApp.Data;
<EditForm Model="Model" OnValidSubmit="Submit">
<DataAnnotationsValidator />
<ValidationSummary />
String:
<br />
<InputText @bind-Value="Model.SomeString" />
<br />
<br />
Enum:
<br />
<InputSelect @bind-Value="Model.SomeEnum">
<option value="">Select Enum</option>
<option value="@SomeEnum.A">@SomeEnum.A</option>
<option value="@SomeEnum.B">@SomeEnum.B</option>
</InputSelect>
<br />
<br />
Nullable Enum:
<br />
<InputSelect @bind-Value="Model.SomeNullableEnum">
<option>Select Nullable Enum</option>
<option value="@SomeEnum.A">@SomeEnum.A</option>
<option value="@SomeEnum.B">@SomeEnum.B</option>
</InputSelect>
<br />
<br />
Int:
<br />
<InputSelect @bind-Value="Model.SomeInt">
<option>Select Int</option>
<option value="1">1</option>
<option value="2">2</option>
</InputSelect>
<br />
<br />
Nullable Int:
<br />
<InputSelect @bind-Value="Model.SomeNullableInt">
<option>Select Nullable Int</option>
<option value="1">1</option>
<option value="2">2</option>
</InputSelect>
<br />
<br />
<button type="submit">Save</button>
</EditForm>
@code
{
SomeModel Model = new Data.SomeModel();
void Submit()
{
System.Diagnostics.Debug.WriteLine("Enum " + Model.SomeEnum);
System.Diagnostics.Debug.WriteLine("Nullable Enum " + Model.SomeNullableEnum);
System.Diagnostics.Debug.WriteLine("Int " + Model.SomeInt);
System.Diagnostics.Debug.WriteLine("Nullable Int " + Model.SomeNullableInt);
}
}
我不确定我是否理解你,但让我们试试看 但是,我需要一个不可为null的必需属性 你的意思是,例如,你想要一个财产,例如:
[Required]
public int SomeInt { get; set; }
绑定到InputSelect组件,如下所示:
<InputSelect @bind-Value="Model.SomeInt">
<option>Select Int</option>
<option value="1">1</option>
<option value="2">2</option>
</InputSelect>
当用户点击提交按钮时,如果用户未选择值,则应显示验证消息
如果是,我的回答是:
InputSelect组件(至少在.Net 5.0之前)只能绑定到字符串和枚举类型
如果你想让你的InputSelect支持绑定到一个int,就像上面的例子一样,你应该按照下面的方式对它进行子类化
public class InputSelectNumber<T> : InputSelect<T>
{
protected override bool TryParseValueFromString(string value, out T result, out string validationErrorMessage)
{
if (typeof(T) == typeof(int))
{
if (int.TryParse(value, out var resultInt))
{
result = (T)(object)resultInt;
validationErrorMessage = null;
return true;
}
else
{
result = default;
validationErrorMessage = "The chosen value is not a valid number.";
return false;
}
}
else
{
return base.TryParseValueFromString(value, out result, out validationErrorMessage);
}
}
}
使现代化
我可以绑定它,但它不遵守必需的属性,不执行任何验证 请运行下面的代码,为“名称”字段输入一个值,然后按“提交”按钮。表格已提交。现在,选择一个国家,然后选择您的国家:。。。将显示一条验证消息。 结论:只有在先前选择并删除某个值时,才会进行验证。我不知道这种行为是设计的还是一个bug。然而,我认为这种行为和Blazor无关。需要检查具有必需属性的select元素在Razor页面中的行为。无论如何,我会尝试解决这个错误,如果成功,我会让你知道
@using System.ComponentModel.DataAnnotations;
<EditForm EditContext="@EditContext" OnValidSubmit="HandleValidSubmit">
<DataAnnotationsValidator />
<div class="form-group">
<label for="name">Enter your Name: </label>
<InputText Id="name" Class="form-control" @bind-Value="@comment.Name"></InputText>
<ValidationMessage For="@(() => comment.Name)" />
</div>
<div class="form-group">
<label for="body">Select your country: </label>
<InputSelect @bind-Value="@comment.Country" >
<option value="0">Select country...</option>
@foreach (var country in Enum.GetValues(typeof(Country)))
{
<option value="@country">@country</option>
}
</InputSelect>
<ValidationMessage For="@(() => comment.Country)" />
</div>
<p>
<button type="submit">Submit</button>
</p>
</EditForm>
@code
{
private EditContext EditContext;
private Comment comment = new Comment();
private void HandleValidSubmit()
{
Console.WriteLine("Submitting");
}
protected override void OnInitialized()
{
EditContext = new EditContext(comment);
base.OnInitialized();
}
public enum Country
{
USA = 1,
Britain,
Germany,
Israel
}
public class Comment
{
[Required]
public string Name { get; set; }
[Required]
public Country Country { get; set; }
}
}
我不确定我是否理解你,但让我们试试看 但是,我需要一个不可为null的必需属性 你的意思是,例如,你想要一个财产,例如:
[Required]
public int SomeInt { get; set; }
绑定到InputSelect组件,如下所示:
<InputSelect @bind-Value="Model.SomeInt">
<option>Select Int</option>
<option value="1">1</option>
<option value="2">2</option>
</InputSelect>
当用户点击提交按钮时,如果用户未选择值,则应显示验证消息
如果是,我的回答是:
InputSelect组件(至少在.Net 5.0之前)只能绑定到字符串和枚举类型
如果你想让你的InputSelect支持绑定到一个int,就像上面的例子一样,你应该按照下面的方式对它进行子类化
public class InputSelectNumber<T> : InputSelect<T>
{
protected override bool TryParseValueFromString(string value, out T result, out string validationErrorMessage)
{
if (typeof(T) == typeof(int))
{
if (int.TryParse(value, out var resultInt))
{
result = (T)(object)resultInt;
validationErrorMessage = null;
return true;
}
else
{
result = default;
validationErrorMessage = "The chosen value is not a valid number.";
return false;
}
}
else
{
return base.TryParseValueFromString(value, out result, out validationErrorMessage);
}
}
}
使现代化
我可以绑定它,但它不遵守必需的属性,不执行任何验证 请运行下面的代码,为“名称”字段输入一个值,然后按“提交”按钮。表格已提交。现在,选择一个国家,然后选择您的国家:。。。将显示一条验证消息。 结论:只有在先前选择并删除某个值时,才会进行验证。我不知道这种行为是设计的还是一个bug。然而,我认为这种行为和Blazor无关。需要检查具有必需属性的select元素在Razor页面中的行为。无论如何,我会尝试解决这个错误,如果成功,我会让你知道
@using System.ComponentModel.DataAnnotations;
<EditForm EditContext="@EditContext" OnValidSubmit="HandleValidSubmit">
<DataAnnotationsValidator />
<div class="form-group">
<label for="name">Enter your Name: </label>
<InputText Id="name" Class="form-control" @bind-Value="@comment.Name"></InputText>
<ValidationMessage For="@(() => comment.Name)" />
</div>
<div class="form-group">
<label for="body">Select your country: </label>
<InputSelect @bind-Value="@comment.Country" >
<option value="0">Select country...</option>
@foreach (var country in Enum.GetValues(typeof(Country)))
{
<option value="@country">@country</option>
}
</InputSelect>
<ValidationMessage For="@(() => comment.Country)" />
</div>
<p>
<button type="submit">Submit</button>
</p>
</EditForm>
@code
{
private EditContext EditContext;
private Comment comment = new Comment();
private void HandleValidSubmit()
{
Console.WriteLine("Submitting");
}
protected override void OnInitialized()
{
EditContext = new EditContext(comment);
base.OnInitialized();
}
public enum Country
{
USA = 1,
Britain,
Germany,
Israel
}
public class Comment
{
[Required]
public string Name { get; set; }
[Required]
public Country Country { get; set; }
}
}
在.NET 5中,InputSelect确实可以绑定到int。但是,我在.NET 3.1中遇到了与枚举绑定的InputSelect的问题。您的意思是不能将selectinput绑定到枚举类型吗?如果是这样,这很奇怪。我可以绑定它,但它不符合要求的属性,没有进行验证。我自己做的研究得出了几乎相同的观点。我想知道我是否应该提交github bugYes,您可以在github中提交一个问题,但这不是一个仅针对枚举类型的问题。例如,如果您使用绑定到字符串类型,如果您未能选择一个值,则只要按“提交”按钮,验证就会发生。在.NET 5中,InputSelect确实可以绑定到int。但是,我在.NET 3.1中遇到了这个问题,它使用了绑定到枚举的InputSelect。您的意思是不能将selectinput绑定到枚举类型吗?如果是这样,这很奇怪。我可以绑定它,但它不符合要求的属性,没有进行验证。我自己做的研究得出了几乎相同的观点。我想知道我是否应该提交github bugYes,您可以在github中提交一个问题,但这不是一个仅针对枚举类型的问题。例如,如果使用“绑定到字符串类型”,则如果未能选择值,则只要按下“提交”按钮,就会进行验证。