Asp.net mvc 4获取十进制值而不是整数

时间:2013-09-26 23:56:40

标签: asp.net-mvc entity-framework currency

我有一个类:

public class Item
{
    public int ItemID { get; set; }

    [Display(Name = "Value")]
    [Column(TypeName = "money")]
    public decimal Value{ get; set; }
}

在我输入12.50的表单中,在我的帖子Action中,对象有Item.Value = 1250,应该有12.50,如何解决这个问题?

行动方法:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Item item)
{
    ...code...
}

查看:

<div class="editor-label">
    @Html.LabelFor(model => model.Value)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Value)
    @Html.ValidationMessageFor(model => model.Value)
</div>

当输入12时,验证客户端会说'字段Valor必须是数字'。但是让我执行post action方法,用12,说同样的话,但不要让我。

2 个答案:

答案 0 :(得分:2)

我用自定义绑定解决了感谢Phil Haack(http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx)。我将DecimalModelBind类修改为:

public class DecimalModelBinder : 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
            {
                var value = valueResult.AttemptedValue.Replace('.', ',');
                actualValue = Convert.ToDecimal(value,
                    CultureInfo.CurrentCulture);
            }
            catch (FormatException e)
            {
                modelState.Errors.Add(e);
            }
            if (bindingContext.ModelState[bindingContext.ModelName] == null)
            {
                bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
            }
            return actualValue;
        }
    }

我添加了这些内容:

var value = valueResult.AttemptedValue.Replace('.', ',');
if (bindingContext.ModelState[bindingContext.ModelName] == null)

第一个将','替换为'。'第二个检查是否没有具有相同名称的ModelState以避免异常。

答案 1 :(得分:0)

尝试在服务器上指定将使用.作为小数分隔符的文化,例如:

<globalization uiCulture="en-US" culture="en-US" />

或者,如果您想使用auto文化(即从客户端浏览器设置和Accept-Language请求标头推断),那么您可以为小数类型编写自定义模型绑定器并使用{{ 1}}属性以显式设置所需的格式。我在下面的帖子中说明了这一点:https://stackoverflow.com/a/11272982/29407(这是DateTime类型,但你也可以轻松地调整[DisplayFormat]类型的示例)