使用货币的输入标记助手上的asp格式的attrubute导致POST操作出现问题

时间:2017-06-21 23:51:14

标签: c# asp.net-core asp.net-core-tag-helpers

在我的ASP.NET Core 1.1, EF-Core 1.1应用中,我使用带有asp格式属性的ASP.NET MVC输入Tag helper作为asp-format="{0:C}",正确地将输入标记上的货币格式显示为{{ 1} ...等。但是当发布$15,201.45.00时,模型仍然以货币格式保留这些值,因此,正如预期的那样,下面显示的POST操作失败。 问题:在发布模型之前,我们如何摆脱货币格式? 注意:输入标记助手here上的一些示例。

View

查看:

public class CustomerOrdersModelView
{
    public string CustomerID { get; set; }
    public int FY { get; set; }

    public float? item1_price { get; set; }
    public float? item2_price { get; set; }
    ...
    public float? item9_price { get; set; }
}

POST操作: [导致问题]

<form asp-controller="CustOrders" asp-action="ProductPrices" method="post">
....
<tr>
 <td>Item1:</td>
 <td><input asp-for="item1_price" asp-format="{0:C}" />></td>
</tr>
<tr>
     <td>Item2:</td>
     <td><input asp-for="item2_price" asp-format="{0:C}" />></td>
</tr>
...
<tr>
     <td>Item9:</td>
     <td><input asp-for="item9_price" />></td>
</tr><tr>
     <td>Item1:</td>
     <td><input asp-for="item1_price" asp-format="{0:C}" /></td>

</table>
<button type="submit" name="submit" value="Add">Update Report</button>
</form>

2 个答案:

答案 0 :(得分:0)

在显示屏中,您可以显示标签附近的货币符号。然后以{C:2}。

的格式显示字符串

然后模型应该正确绑定值。

答案 1 :(得分:0)

您是否尝试将ModelBinderAttribute应用于模型?

例如,应用属性,然后从传入的RAW表单值中获取按摩值

[ModelBinder(BinderType = typeof(CustomerOrdersEntityBinder))]
public class CustomerOrdersModelView
{
    public string CustomerID { get; set; }
    public int FY { get; set; }

    public float? item1_price { get; set; }
    public float? item2_price { get; set; }   
    public float? item9_price { get; set; }

}


public class CustomerOrdersEntityBinder : IModelBinder
{


    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException(nameof(bindingContext));
        }

        var model = new CustomerOrdersModelView();

        if (bindingContext.ModelType != typeof(CustomerOrdersModelView))
            return TaskCache.CompletedTask;

        // Try to fetch the value of the argument by name
        var valueProviderResult =  bindingContext.ValueProvider.GetValue("item1_price");

        if (valueProviderResult == ValueProviderResult.None)
        {
            return TaskCache.CompletedTask;
        }

        model.item1_price = float.Parse(valueProviderResult.FirstValue.Replace("$",string.Empty).Replace(",",string.Empty));

        bindingContext.Result = ModelBindingResult.Success(model);
        return TaskCache.CompletedTask;
    }
}