首页 > 解决方案 > 为什么我在发送小数时收到零?

问题描述

在我看来,我有两个数字输入(整数或十进制)。如果我发送整数应用程序运行良好,但如果我发送小数,IDK 为什么应用程序接收 0

示例:我输入了价格,我写了12.55的值,当我请求保存数字时,在我的控制器中该值显示为 0,因此数据库将其保存为 0

我想知道发生了什么

这是我的看法:

<div class="modal fade" id="myModal" tabindex="-1" role="dialog" 
      aria-labelledby="myModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h4 class="modal-title" id="myModalLabel">Add concept</h4>
        <button type="button" class="close" data-dismiss="modal">×</button>
      </div>
      <div class="modal-body">
      <form>
        <div style="visibility:hidden">
          <input type="text" id="mIdcon" disabled="disabled" />
          <input type="text" id="mIdreq" disabled="disabled" />
        </div>
        <div class="row form-group">
          <div class="col-md-5">
            <label for="mCanti">Quantity</label>
            <input type="text" class="form-control" 
                    id="mCanti" placeholder="Quantity" 
                    onkeypress="return filterFloat(event, this);" />
          </div>
          <div class="col-md-1">
          </div>
          <div class="col-md-6">
            <label for="Fent">Delivery Date:</label>
            <input type="text" class="datefield form-control" 
                    id="Fent" placeholder="DD/MM/AAAA" />
          </div>
        </div>
        <div class="row form-group">
          <div class="col-md-5">
            <label for="UDM">UDM / UOM</label>
            <input type="text" class="form-control" id="mUDM" maxlength="2" 
                    placeholder="UDM / UOM" />
          </div>
          <div class="col-md-1">
          </div>
          <div class="col-md-6">
            <label for="cCta">Acount</label>
            @Html.DropDownList("ctaMAX", null, new { 
              @id = "cCta", 
              @class = "btn btn-primary dropdown-toggle", 
              @style = "color:#777777;background-color:#f8f8f8;border-color:#e7e7e7" })
          </div>
        </div>
        <div class="row form-group">
          <div class="col-md-6">
            <label for="Descripcion">Description</label>
            <input type="text" class="form-control" id="mDes" 
                    placeholder="Description" />
          </div>
          <div class="col-md-6">
            <label for="par">Partialities</label>
            @Html.DropDownList("parci", null, new { 
                @id = "par", 
                @class = "btn btn-primary dropdown-toggle", 
                @style = "color:#777777;background-color:#f8f8f8;border-color:#e7e7e7" })
          </div>
        </div>
        <div class="row form-group">
          <div class="col-md-5">
            <label for="NoParte">Part Number</label>
            <input type="text" class="form-control" id="mNopa" 
                    placeholder="Part Number" />
          </div>
          <div class="col-md-7">
          </div>
        </div>
        <div class="row form-group">
        <div class="col-md-5">
          <label for="Precio">Unit Price</label>
          <input type="text" class="form-control" id="mPrecio" 
                  placeholder="Unit Price" 
                  onkeypress="return filterFloat(event, this);" />
        </div>
        <div class="col-md-7">
        </div>
      </div>
    </form>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-primary" id="btnAdd" 
                onclick="return AddConcept();">Add</button>
        <button type="button" class="btn btn-default" data-dismiss="modal">
          Close
        </button>
      </div>
    </div>
  </div>
</div>

这是我的 JS:

function AddConcept() {
var res = Validate(); // This function just validate that the inputs aren't empty
if (res == false) {
    return false;
}

var ConceptoObj = {
    idconcepto: $('#mIdcon').val(),
    idreq: $('#idreq').val(),
    cantidad: $('#mCanti').val(),
    UDM: $('#mUDM').val(),
    descripcion: $('#mDes').val(),
    NoParte: $('#mNopa').val(),
    precio: $('#mPrecio').val(),
    FechaEntrega: $('#Fent').val(),
    PagoParcial: $('#par option:selected').val()
};
var c = $('#cCta').val();
var f = $('#fes').val();
var m = $('#mon').val();

$.ajax({
    url: '/Order/AddConcept?cta=' + c + '&fs=' + f + '&cm=' + m,
    data: JSON.stringify(ConceptoObj),
    type: "POST",
    contentType: "application/json;charset=utf-8",
    dataType: "json",
    success: function (result) {
        CargarConceptosOC();
        AjusteRate();
        if (result == "-100")
            alert("-You have exceeded the limit of concepts for this Requisition-");
        if (result == "-200")
            alert("-There is a problem. Contact the admin-");
        $('#myModal').modal('hide');

    },
    error: function (errormessage) {
        alert(errormessage.responseText);
    }
});

}

这是我的控制器:

public JsonResult AddConcept(ConceptosOC conOC, string cta, string fs, string cm)
{
    int resp = 0, idcon = 0;
    resp = objDB.CUDConceptosOC(conOC, 1);
    DateTime fesol = conOC.FechaEntrega == null 
                        ? DateTime.Today : (DateTime)conOC.FechaEntrega;
    DateTime fcenti;

    decimal rate = Convert.ToDecimal(
                    objDB.SelectCadena("Here I get the dolar price"));
    int renglon = Convert.ToInt32(
                    objDB.SelectCadena("Here I get the row that I want to modify"));

    if (resp == -1)
    {
        idcon = Convert.ToInt32(objDB.SelectCadena("Here I get a specific ID"));

        switch (conOC.PagoParcial)
        {
          case 2:
          // Ignore this
          break;
          default:
            resp = objDB.Ejecutar(
              "INSERT INTO ACOUNTS(ID_CONCEPT, ID_REQUEST, AMOUNT, ACOUNT, REGISTER_DATE, ROW_AFFECTED)" +
              "values(" + idcon + "," + conOC.idreq + "," + 
              ((conOC.cantidad * conOC.precio) * rate).ToString("G", CultureInfo.InvariantCulture) + 
              ",'" + cta + "','" + fesol.ToString("yyyy-MM-dd") + 
              "'," + (renglon + 1) + ")");
            break;
        }
    }
    return Json(resp, JsonRequestBehavior.AllowGet);
}

这是我的对象:

public class ConceptosOC
{
    public int idconcepto { get; set; }
    public int idreq { get; set; }
    public decimal cantidad { get; set; }
    public string UDM { get; set; }
    public string descripcion { get; set; }
    public string NoParte { get; set; }
    public decimal precio { get; set; }
    public DateTime? FechaEntrega { get; set; }
    public int PagoParcial { get; set; }

}

这些是我的过滤功能:

function filterFloat(evt, input) {
var key = window.Event ? evt.which : evt.keyCode;
var chark = String.fromCharCode(key);
var tempValue = input.value + chark;
if (key >= 48 && key <= 57) {
    if (filter(tempValue) === false) {
        return false;
    } else {
        return true;
    }
} else {
    if (key == 8 || key == 13 || key == 0) {
        return true;
    } else if (key == 46) {
        if (filter(tempValue) === false) {
            return false;
        } else {
            return true;
        }
    } else {
        return false;
    }
}}


function filter(__val__) {
var preg = /^([0-9]+\.?[0-9]{0,4})$/;
if (preg.test(__val__) === true) {
    return true;
} else {
    return false;
}}

标签: c#htmlasp.net-mvc

解决方案


您可能收到 0,因为它是您模型的默认值。这意味着您的应用程序无法将接收到的值绑定到您的模型,因为它无法将其转换回 C# 模型。这可能与您的服务器配置文化的方式有关。您正在发送12.55,并且您的服务器可能会期待类似“ 12,55 ”的内容,例如,如果它是用法语或西班牙语配置的。您可以尝试使用实现System.Web.Mvc.IModelBinder的自定义模型绑定器来修改十进制值的模型绑定。你可以试试这样的。定义自定义模型绑定器

using System;
using System.Globalization;
using System.Web.Mvc;  

public class CustomDecimalModelBinder : IModelBinder
{
    /// <summary>
    /// Gets the decimal value from data received
    /// </summary>
    /// <param name="controllerContext">Controller context</param>
    /// <param name="bindingContext">Binding context</param>
    /// <returns>Parsed value</returns>
    public object BindModel(ControllerContext controllerContext, 
                            System.Web.Mvc.ModelBindingContext bindingContext)
    {
        ValueProviderResult result = bindingContext.ValueProvider
            .GetValue(bindingContext.ModelName);

        var modelState = new System.Web.Mvc.ModelState { 
                                        Value = result 
                                    };

        object actualValue = null;
        var culture = CultureInfo.CurrentCulture;
        if (result.AttemptedValue != string.Empty)
        {
            try
            {
                // Try with your current culture
                actualValue = Convert.ToDecimal(result.AttemptedValue, culture);
            }
            catch (FormatException)
            {
                try
                {
                    // Try with invariant culture if current culture failed
                    actualValue = Convert.ToDecimal(result.AttemptedValue, 
                                                CultureInfo.InvariantCulture);
                }
                catch (FormatException ex)
                {
                    modelState.Errors.Add(ex);
                }
            }
        }
        bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
        return actualValue;
    }
}

在 Application_Start 方法中使用它

protected void Application_Start()
{
    // ... normal MVC configuration code

    // This one binds Decimal types
    ModelBinders.Binders.Add(typeof(decimal), new CustomDecimalModelBinder ());
    // This one binds Nullable Decimal types, if you want to support those also
    ModelBinders.Binders.Add(typeof(decimal?), new CustomDecimalModelBinder ());
}

推荐阅读