Как привязать поля ввода к десятичному (18,4)? - PullRequest
0 голосов
/ 03 августа 2020

Я создаю форму для работы с таблицей, в которой некоторые поля установлены как десятичные (18, 4) для хранения финансовых данных.

Когда я пытаюсь заполнить поля своей формой, модель считается действительным, если значения являются целыми числами, но нет, если значения имеют десятичные дроби. Чтобы обойти проблемы глобализации, у меня есть набор обычных текстовых полей, где люди могут вводить числа и анализировать их в скрытых полях с помощью некоторых javascript:

Мой контроллер выполняет довольно простые вещи. :

public ActionResult BudgetForm(SomeObject pFormObject)
{
    if (ModelState.IsValid)
    {
        db.Entry(pFormObject).State = EntityState.Modified;
        try
        {
            db.SaveChanges();
        }
        catch (DbEntityValidationException e)
        {
            /* do some exception handling */
        }
    return RedirectToAction("Index", "Identification");
    }
    return View(pFormObject);
}

Модель сгенерирована из базы данных, я просто добавил некоторые метаданные в отдельный файл для форматирования отображения:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace WebApp.Models
{
    using System;
    using System.Collections.Generic;
    
    public partial class SomeObject
    {
        public System.Guid ID { get; set; }
        (...)
        public Nullable<decimal> BudgetA1 { get; set; }
        public Nullable<decimal> BudgetA2 { get; set; }
        public Nullable<decimal> BudgetA3 { get; set; }
        public Nullable<decimal> BudgetA4 { get; set; }
    }
}

Файл метаданных

using System;
using System.ComponentModel.DataAnnotations;

namespace WebApp.Models
{
    [MetadataType(typeof(SomeObjectMetadata))]
    public partial class SomeObject
    {
    }

    public class SomeObjectMetadata
    {
        (...)

        [DisplayFormat(DataFormatString = "{0:C}")]
        public decimal BudgetA1;

        [DisplayFormat(DataFormatString = "{0:C}")]
        public decimal BudgetA2;

        [DisplayFormat(DataFormatString = "{0:C}")]
        public decimal BudgetA3;

        [DisplayFormat(DataFormatString = "{0:C}")]
        public decimal BudgetA4;
    }
}

Если пользователь вводит 8400 в одно из полей, я получаю 8400M в качестве значения в объекте, который получает контроллер. Если пользователь вводит 8400.04 в одно из полей, я вижу это значение в DevTools Chrome как для значения текстового поля, так и для значения скрытого поля как данных, отправленных в запросе POST, но я получаю null значение, если я проверяю свойства объекта, которые контроллер получает в отладчике, и контроллер по праву возвращает мне форму с данными в полях.

Что мне не хватает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...