Я создаю форму для работы с таблицей, в которой некоторые поля установлены как десятичные (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
значение, если я проверяю свойства объекта, которые контроллер получает в отладчике, и контроллер по праву возвращает мне форму с данными в полях.
Что мне не хватает?