Mar*_*ova 6 c# asp.net-mvc entity-framework asp.net-core
几个小时以来,我一直在寻找解决此问题的方法,但没有找到任何适合我的方法。
这里我们使用逗号作为小数点分隔符,当我发送一个像“15,50”这样的值时,在我的控制器中,我得到的模型值为“1550”,只有当我发送“15.50”时才有意义。
我涵盖了以下主题,但没有任何效果。
在 Asp.net Core 中将 CultureInfo 设置为具有 . 作为 CurrencyDecimalSeparator 而不是 ,
Aspnet Core Decimal 绑定不适用于非英语文化
我使用ajax发送表单,使用$form.serializeArray()如下:
function getFormData(xform) {
var $form = $('#' + xform);
var unindexed_array = $form.serializeArray();
var indexed_array = {};
$.map(unindexed_array, function (n, i) {
indexed_array[n['name']] = n['value'];
});
return indexed_array;
}
Run Code Online (Sandbox Code Playgroud)
发送:
function PostFormAjax(controller, metodo, params, redir, divacao, reloadgrid) {
if (params != null) {
var formData = new FormData();
var json = $.parseJSON(JSON.stringify(params));
$(json).each(function (i, val) {
$.each(val, function (k, v) {
console.log(k + " : " + v);
formData.append(k, v);
});
});
}
$.ajax({
url: '/' + controller + '/' + metodo,
data: JSON.stringify(params),
contentType: 'application/json',
type: 'POST',
success: function (data) {
AjaxFim(metodo, data, redir, divacao, reloadgrid);
}
});
}
Run Code Online (Sandbox Code Playgroud)
我的控制器:
[HttpPost]
public IActionResult GravaProduto([FromBody] Produtos produto)
{
if (ModelState.IsValid)
{
//produto.Valorcusto is 1550 and not 15,50 as it was posted
//produto.Valorvenda is 1550 and not 15,50 as it was posted
}
}
Run Code Online (Sandbox Code Playgroud)
我的模型.cs
public partial class Produtos
{
public int Cod { get; set; }
public string Descricao { get; set; }
public decimal Valorcusto { get; set; }
public decimal Valorvenda { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我试图在 formData.append(k, v.replace(',', '.'));也不起作用,我也不知道哪个字段是小数。
我需要做什么?因为我迷路了,本来应该更简单的事情变得更复杂了。
在找到解决方案之前,我为继续工作所做的工作是:
根据我所在地区的情况戴口罩:
$('.stValor').mask("#.###.##0,00", { reverse: true });
Run Code Online (Sandbox Code Playgroud)
在发布表单之前,我切换到接受的格式:
$('#fCadAltProd').validator().on('submit', function (e) {
if (e.isDefaultPrevented()) {
} else {
e.preventDefault();
$('.stValor').mask("#,###,##0.00", { reverse: true });
//Ajax post here
}
});
Run Code Online (Sandbox Code Playgroud)
这里我们使用逗号作为小数点分隔符,当我发送一个像“15,50”这样的值时,在我的控制器中,我得到的模型值为“1550”,只有当我发送“15.50”时才有意义。
使用挪威文化创建自定义模型绑定器,因为挪威也使用逗号小数分隔符。您可能还想指定某些多个允许的数字样式。
这是仍然需要进行错误处理的一个。不过,它为您提供了基本概念,您可以从这里开始构建。我会做的事情是从内置的DecimalModelBinder.
using System.Globalization;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.ModelBinding.Binders;
using Microsoft.Extensions.Logging;
namespace AspNetCorePlayground.Models
{
public class MyFirstModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var valueProviderResult = bindingContext
.ValueProvider
.GetValue(bindingContext.ModelName);
var cultureInfo = new CultureInfo("no"); // Norwegian
decimal.TryParse(
valueProviderResult.FirstValue,
// add more NumberStyles as necessary
NumberStyles.AllowDecimalPoint,
cultureInfo,
out var model);
bindingContext
.ModelState
.SetModelValue(bindingContext.ModelName, valueProviderResult);
bindingContext.Result = ModelBindingResult.Success(model);
return Task.CompletedTask;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后像这样装饰你的班级:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding.Binders;
namespace AspNetCorePlayground.Models
{
public class MyFirstModelBinderTest
{
[ModelBinder(BinderType = typeof(MyFirstModelBinder))]
public decimal SomeDecimal { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
我在控制器上对其进行了测试:
[HttpGet("test")]
public IActionResult TestMyFirstModelBinder(MyFirstModelBinderTest model)
{
return Json(model);
}
Run Code Online (Sandbox Code Playgroud)
这是结果:
使用此插件jquery.serializeToJSON 并将getFormData()函数更改为
function getFormData(xform) {
var $form = $('#' + xform);
var obj = $form.serializeToJSON({
parseFloat: {
condition: ".stValor,.stQnt,.stDesconto",
nanToZero: true,
getInputValue: function (i) {
return i.val().split(".").join("").replace(",", ".");
}
}
});
return obj;
}
Run Code Online (Sandbox Code Playgroud)
parseFloat.getInputValue:function(){},默认返回不带逗号的输入值,转换时不会出错。如果您所在的位置使用逗号作为小数点分隔(例如德语或巴西),您可以更改为
function(i){
return i.val().split(".").join("").replace(",", ".");
}
Run Code Online (Sandbox Code Playgroud)
这将为您完成所有工作。
| 归档时间: |
|
| 查看次数: |
4269 次 |
| 最近记录: |