如何在ASP中使用货币格式.. NET MVC模型在显示模式和保存数据时

本文关键字:模式 显示 模型 保存 数据 MVC 格式 ASP 货币 NET | 更新日期: 2023-09-27 18:08:38

. NET MVC核心代码第一个项目,我有一个具有类型浮动的属性SaleAmount的模型,我成功地以货币格式显示,但是当我使用此属性保存数据时,我在SQL Server数据库中获得此字段为空。在调试模式下,当我在控制器中的oAnnualSales.SaleAmount = item.SaleAmount;行(如下所示)上放置一个断点时,我可以看到item.SaleAmount为空。

<<p> 视图/strong>:
public class AnnualSale
{    @model IList<MyProj.Models.SaleViewModel>
<div class="row">
    <div class="col-md-9">
        <form asp-controller="DbRelated" asp-action="UpdateSales" asp-route-returnurl="@ViewData[" ReturnUrl"]" method="post">
            <table class="table">
                <thead>
                    <tr>
                        <th></th>
                        <th>
                            State Name
                        </th>
                        <th>
                            Sale Amount
                        </th>
                    </tr>
                </thead>
                <tbody>
                    @for (int i = 0; i < Model.Count(); i++)
                    {
                    <tr>
                        <td>@Html.HiddenFor(r => r[i].StateId)</td>
                        <td>
                            @Html.EditorFor(r => r[i].StateName)
                        </td>
                        <td>
                            @Html.EditorFor(r => r[i].SaleAmount)
                        </td>
                    </tr>
                    }
                </tbody>
            </table>
            <button type="submit" class="btn btn-default">Save</button>
        </form>
    </div>
</div>
    [Key]
    public int Sale_Id { get; set; }
    public int? FiscalYear { get; set; }
    [DisplayFormat(DataFormatString = "{0:C0}", ApplyFormatInEditMode = true)]
    public float? SaleAmount { get; set; }
    public int StateId { get; set; }
    public StateName StateName { get; set; }
}

:

public class AnnualGrant
{
    [Key]
    public int Sale_Id { get; set; }
    public int? FiscalYear { get; set; }
    [DisplayFormat(DataFormatString = "{0:C0}", ApplyFormatInEditMode = true)]
    public float? SaleAmount { get; set; }
    public int StateId { get; set; }
    public StateName StateName { get; set; }
}
控制器

:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> UpdateSales(List<SaleViewModel> model, string returnUrl = null)
{
    if (ModelState.IsValid)
    {
        foreach (var item in model)
        {
            var oAnnualSales = _context.AnnualSales.Where(r => r.StateId.Equals(item.StateId)).FirstOrDefault();
            if (oAnnualSales != null)
            {
                oAnnualSales.FiscalYear = item.FY;
                oAnnualSales.SaleAmount = item.SaleAmount;
            }
            else
            {
                AnnualSale oAnnualSaleNew = new AnnualSale { StateId = item.StateId, FiscalYear = item.FY, SaleAmount = item.SaleAmount};
                _context.Add(oAnnualSaleNew);
            }
        }
        await _context.SaveChangesAsync();
        return View(model);
    }
    // If we got this far, something failed, redisplay form
    return View();
}

如何在ASP中使用货币格式.. NET MVC模型在显示模式和保存数据时

正如在评论中提到的你的问题,张贴字符,如货币符号与值将不会解析为浮点数?, So将返回null。你可以通过编写一个快速单元测试或使用float的控制台应用来进行测试。将返回0。您需要(不建议)将金额更改为字符串,或者(建议)将货币类型和金额作为不同的属性。发布带有金额的货币符号也依赖于用户输入货币符号,这是不太可能发生的

在ASP中默认不支持。但是你可以使用自定义模型绑定器来解决这个问题。

您首先需要为自定义模型绑定创建一个新类:

public class FloatModelBinder : IModelBinder
{
  public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
  {
    ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
    ModelState modelState = new ModelState { Value = valueResult };
    object actualValue = null;
    try
    {
      if (bindingContext.ModelMetadata.EditFormatString.StartsWith("{0:c", StringComparison.InvariantCultureIgnoreCase))
      {
        actualValue = float.Parse(valueResult.AttemptedValue, NumberStyles.Currency);
      }
      else
      {
        actualValue = float.Parse(valueResult.AttemptedValue, CultureInfo.CurrentCulture);
      }
    }
    catch (FormatException e)
    {
      modelState.Errors.Add(e);
    }
    bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
    return actualValue;
  }
}

然后你需要通过将它添加到Application_Start方法来将它添加到MVC绑定器中:

protected void Application_Start()
{
  ModelBinders.Binders.Add(typeof(float?), new FloatModelBinder());    
}