使用ASP..NET Core MVC与.NET 6,数字从输入标签的形式是失去小数分隔符时,被转移到控制器



我试图创建一个表单来将新项目添加到我的数据库中,我的模型包含一个价格。价格的类型是double,我的表单上输入的数字步长是0.01问题是,当使用表单提交新项目时,无论输入标记的lang属性如何,数字都将丢失小数分隔符,因此使用逗号或点不会产生影响。因此,当我把5.45和5.45作为价格写在我的商品清单上时,它们都将变成545.00。

这是我的模型:

public class Pizza 
{
public Pizza(int id, string name, string description, double price, string pictureUrl) 
{
Id = id;
Name = name;
Description = description;
Price = price;
PictureUrl = pictureUrl;
}
public Pizza() { }
[Key]
public int Id { get; set; }

[Required(ErrorMessage = "Il campo è obbligatorio.")]
public string Name { get; set; }

[Required(ErrorMessage = "Il campo è obbligatorio.")]
public string Description { get; set; }

[Required(ErrorMessage = "Il campo è obbligatorio.")]
[Range(0, double.MaxValue, ErrorMessage = "Il prezzo non può essere negativo.")]
public double Price { get; set; } // This is the property which is being set to the wrong value

[Required(ErrorMessage = "Il campo è obbligatorio.")]
public string PictureUrl { get; set; }
}

这里是控制器动作的代码:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult New(Pizza pizza) 
{
if (!ModelState.IsValid) 
{
return View("New", pizza);
}
using (var db = new PizzasDbContext()) 
{
int modifications = db.AddPizza(pizza);
Console.WriteLine(modifications);
}
return RedirectToAction("Index");
}

找到了一个适合我的有点粗糙的解决方案。问题是,在我看来,表单总是在任何时候返回带点的十进制值。这很可能是HTML或JavaScript的标准。

解决方案是强制服务器线程使用使用点而不是逗号来表示双精度的区域性,因为从视图返回的值实际上是一个字符串,因此在解析时将丢失任何点或无用的零。

为我工作的代码如下:

var cultureInfo = new CultureInfo("en-US");
cultureInfo.NumberFormat.CurrencySymbol = "€";
cultureInfo.NumberFormat.NumberDecimalSeparator = ".";
CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;

我在这个StackOverflow帖子上找到了代码。

嗯,根据您的代码片段,很明显,您没有为Price属性定义十进制精度。因此,它不能识别小数点。您应该按照以下方式更新代码:

Pizza POCO Model:

[Required]
[Column(TypeName = "decimal(18, 2)")] // OR `[Precision(18, 2)]`
public decimal Price { get; set; }

注意:这意味着Price将是一个十进制数,它将包含最多18个主数以及.点后的2个十进制精度。记住[Column(TypeName = "decimal(18, 2)")][Precision(18, 2)]的作用是一样的。但是,您可以保留public double Price,但注释应该是[Column(TypeName = "decimal(18, 2)")]

数据库模式应该是:

Price Decimal(18,2) NOT NULL

上述原因可能会导致您的小数结果出乎意料。

注意:更多细节可在官方文件中找到。

最新更新