[英]How to get the ASP.NET Core 2.0 MVC Model Binder to bind complex types without FromBody attributes
[英]asp.net core 2.0 bind model with decimal value
我一直在尋找這個案例的解決方案幾個小時,我找不到任何有用的東西。
這里我們使用逗號作為小數分隔符,當我發送一個像“15,50”這樣的值時,在我的控制器中我得到模型的值為“1550”,只有發送“15.50”才有意義。
我討論了以下主題,但沒有任何效果。
在Asp.net Core中設置CultureInfo有一個。 作為CurrencyDecimalSeparator而不是,
我使用$form.serializeArray()
發送帶有ajax的表單,如下所示:
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;
}
發送:
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);
}
});
}
我的控制器:
[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
}
}
我的Model.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; }
}
我試圖在formData.append(k, v.replace(',', '.'));
進行替換formData.append(k, v.replace(',', '.'));
並且也不起作用,我也不知道哪個字段是小數。
我需要做什么? 因為我迷路了,應該更簡單的事情變得更加復雜。
在找到解決方案之前我一直努力工作的是:
根據我的區域設置戴口罩:
$('.stValor').mask("#.###.##0,00", { reverse: true });
在發布表單之前,我切換到可接受的格式:
$('#fCadAltProd').validator().on('submit', function (e) {
if (e.isDefaultPrevented()) {
} else {
e.preventDefault();
$('.stValor').mask("#,###,##0.00", { reverse: true });
//Ajax post here
}
});
這里我們使用逗號作為小數分隔符,當我發送一個像“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;
}
}
}
然后像這樣裝飾你的類:
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; }
}
}
我在控制器上測試了它:
[HttpGet("test")]
public IActionResult TestMyFirstModelBinder(MyFirstModelBinderTest model)
{
return Json(model);
}
這是結果:
使用此插件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;
}
parseFloat.getInputValue:function(){},默認情況下,返回沒有逗號的輸入值,轉換時不會發生錯誤。 如果您的位置使用逗號進行小數分隔,例如在德語或巴西,您可以更改為
function(i){
return i.val().split(".").join("").replace(",", ".");
}
這將為您完成所有工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.