Задать вопрос
@Prorom-exe
.NET developer

Не приходит значение View?

есть форма
<form>
<div class="d-flex flex-row justify-content-between">
                <div class="form-group">
                    <label asp-for="Price" class="control-label">Цена c Aliexpress</label>
                    <input asp-for="Price" class="form-control" type="number" id="Price" onchange="GetPrice()" />
                    <span asp-validation-for="Price" class="text-danger"></span>
                </div>

                <div class="form-group  pl-3">
                    <label asp-for="SalePrice" class="control-label">Цена продажи</label>
                    <input asp-for="SalePrice" class="form-control" type="number" id="SalePrice" />
                    <span asp-validation-for="SalePrice" class="text-danger"></span>
                </div>
            </div>
</form>

и код функции
function GetPrice() {
    const a = 0.8 
    const b = 0.7 
    var checkb = document.getElementById("chbox")
    console.log(typeof (checkb))
   if (checkb.checked)
   {
       let price = document.getElementById("Price").value * b
       document.getElementById("SalePrice").value = Number(price.toFixed(2))
    }
    else 
   {
       let price = document.getElementById("Price").value * a
       document.getElementById("SalePrice").value = Number(price.toFixed(2))
       
    }
}


когда значения цифр целые или оба поля установлены вручную, то все данные при приходят.
А когда значения с плавающей точкой, то не приходят данные SalePrice.
  • Вопрос задан
  • 120 просмотров
Подписаться 1 Средний 11 комментариев
Решения вопроса 1
@Prorom-exe Автор вопроса
.NET developer
Решение было следующее, EF нужно было прописать провайдер для того, чтобы он мог мапать числа с плавающей точкой адекватно.
//в стартапе
services.AddControllersWithViews(
                options => options.ModelBinderProviders.Insert(0, new InvariantDecimalModelBinderProvider()));

public class InvariantDecimalModelBinderProvider : IModelBinderProvider
    {
        private readonly ILoggerFactory loggerFactory;

        public IModelBinder GetBinder(ModelBinderProviderContext context)
        {
            if (context == null) throw new ArgumentNullException(nameof(context));

            if (!context.Metadata.IsComplexType && (context.Metadata.ModelType == typeof(decimal) || context.Metadata.ModelType == typeof(decimal?)))
            {
                ILoggerFactory loggerFactory = context.Services.GetRequiredService<ILoggerFactory>();
                return new InvariantDecimalModelBinder(context.Metadata.ModelType, loggerFactory);
            }

            return null;
        }
    }

    public class InvariantDecimalModelBinder : IModelBinder
    {
        private readonly SimpleTypeModelBinder _baseBinder;

        public InvariantDecimalModelBinder(Type modelType, ILoggerFactory loggerFactory)
        {
            _baseBinder = new SimpleTypeModelBinder(modelType, loggerFactory);
        }

        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            if (bindingContext == null) throw new ArgumentNullException(nameof(bindingContext));

            var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

            if (valueProviderResult != ValueProviderResult.None)
            {
                bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult);

                var valueAsString = valueProviderResult.FirstValue;
                decimal result;

               
                if (decimal.TryParse(valueAsString, NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out result))
                {
                    bindingContext.Result = ModelBindingResult.Success(result);
                    return Task.CompletedTask;
                }
            }

           it
            return _baseBinder.BindModelAsync(bindingContext);
        }
    }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
dollar
@dollar
Делай добро и бросай его в воду.
Так сделайте отладку.
Вставьте в нужные места console.log() или хотя бы alert(), и смотрите, где какие промежуточные значения.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
23 дек. 2024, в 22:02
30000 руб./за проект
23 дек. 2024, в 22:01
350000 руб./за проект
23 дек. 2024, в 21:32
20000 руб./за проект