我使用InputSelectNumber类作为模板创建的布尔值InputSelect时遇到了一个奇怪的问题,我相信您已经看到该类被共享(见下文(:
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);
}
}
}
下面,经过几次调整,它可以使用布尔值(它确实可以正常工作(:
public class InputSelectBoolean<T> : InputSelect<T>
{
protected override bool TryParseValueFromString(string value, out T result,
out string validationErrorMessage)
{
if (typeof(T) == typeof(bool))
{
if(bool.TryParse(value, out var resultBool))
{
result = (T)(object)resultBool;
validationErrorMessage = null;
return true;
}
else
{
result = default;
validationErrorMessage = "The chosen value is not a valid boolean.";
return false;
}
}
else
{
return base.TryParseValueFromString(value, out result, out validationErrorMessage);
}
}
}
然后在剃刀页面上,实现是:
<EditForm Model="@isMyConverted">
<InputSelectBoolean @bind-Value="@isMyConverted">
<option value="true" selected>USD</option>
<option value="false">XOM</option>
</InputSelectBoolean>
</EditForm>
@code {
public bool @isMyConverted = false;
}
它实际上运行得很好,并且进行了应该进行的更改。然而,在选择器窗格上,默认情况下它总是空的,因此不显示USD或XOM。我必须选择一个值两次,它才能保持在窗格中显示。否则,它将保持为空(即使对实际变量的更改完全发生(。
如果我把整个东西改成Int输入,就像这样:
<EditForm Model="@isMyConverted">
<InputSelectNumber @bind-Value="@isMyConverted">
<option value="1" selected>USD</option>
<option value="2">XOM</option>
</InputSelectNumber>
</EditForm>
@code {
public int isMyConverted = 1;
}
一切都很好,所选的值如预期的那样出现在选择器窗格中。如有任何帮助,我们将不胜感激。
true和true之间存在字符串不匹配。
有两种方法可以解决这个问题:
1.更改选项值(以大写字母开头(
<InputSelectBoolean @bind-Value="isMyConverted">
<option value="True">true</option>
<option value="False">false</option>
</InputSelectBoolean>
2.重写并调整InputSelect组件的FormatValueAsString方法
protected override string FormatValueAsString(bool value)
{
return value.ToString().ToLower();
}
如果你只想使用InputSelectBoolean来解析布尔参数(就像上面提到的名字一样(,我已经对你的代码进行了一点优化:
public class InputSelectBoolean : InputSelect<bool>
{
protected override bool TryParseValueFromString(string? value, out bool result,
out string validationErrorMessage)
{
if (bool.TryParse(value, out var resultBool))
{
result = resultBool;
validationErrorMessage = string.Empty;
return true;
}
result = default!;
validationErrorMessage = "The chosen value is not a valid boolean.";
return false;
}
}