Я использую сервер blazor с использованием .net6.
Я использую сервер blazor с использованием .net6. p>
Я создал компонент, который переопределяет базу ввода, и по большей части он работает нормально. Пользовательский ввод распознается по размытию, а затем текст форматируется в соответствии с требуемым шаблоном. Что не работает, так это проверка ввода. У меня есть метод TryParseValueFromString, который реализует мою логику MIN и MAX, но, похоже, это противоречит моей логике onblur. Кажется, я могу либо заставить работать проверку, но не изменять отображение десятичных знаков, либо наоборот.
Это мой полный код компонента:
Код: Выделить всё
@inherits InputBase
@using System.Globalization
@using System.Text.RegularExpressions
@if (!string.IsNullOrWhiteSpace(InputPrompt))
{
@InputPrompt
}
else
{
}
@code {
[Parameter]
public string FormatString { get; set; }
[Parameter]
public double? Min { get; set; }
[Parameter]
public double? Max { get; set; }
[Parameter]
public string InputPrompt { get; set; } = string.Empty;
[Parameter]
public string Styles { get; set; }
[Parameter]
public string InputGroupStyles { get; set; }
[Parameter]
public EventCallback ChangeEvent { get; set; }
private string stringValue = null;
private string _currentValue = null;
protected override void OnInitialized()
{
this.stringValue = this.FormatValueAsString(this.Value);
if (!this.stringValue.Contains("."))
{
this.stringValue = this.stringValue + ".00";
}
base.OnInitialized();
}
private async Task OnInput(ChangeEventArgs e)
{
_currentValue = e.Value.ToString();
}
private async Task OnBlur()
{
if(Decimal.TryParse(_currentValue, out decimal dValue))
{
stringValue = Math.Round(dValue, 2).ToString("0.00");
this.CurrentValueAsString = stringValue;
this.Value = (double)dValue;
}
ChangeEvent.InvokeAsync();
}
// Need this to allow input base to receive value if in format other than its default, expanded to allow testing of Min / Max constraints
protected override bool TryParseValueFromString(string? value, out double result, out string? validationErrorMessage)
{
if (BindConverter.TryConvertTo(value, System.Globalization.CultureInfo.InvariantCulture, out result))
{
if (Min != null)
{
BindConverter.TryConvertTo(value, CultureInfo.InvariantCulture, out double dValue);
if (dValue < Min)
{
validationErrorMessage = "Value Must be greater than " + Min;
return false;
}
}
if (Max != null)
{
BindConverter.TryConvertTo(value, CultureInfo.InvariantCulture, out double dValue);
if (dValue > Max)
{
validationErrorMessage = "Value Must be less than " + Max;
return false;
}
}
validationErrorMessage = null;
return true;
}
else
{
validationErrorMessage = "Can't parse value";
return false;
}
}
protected override string? FormatValueAsString(double value)
{
return value.ToString();
}
}
Большое спасибо
Подробнее здесь: https://stackoverflow.com/questions/791 ... alidate-in