0

我有一个像这样的课程:

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

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

在表格中我输入 12.50,在我的帖子操作中,对象的 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,说同样的话,但不要让我。

4

2 回答 2

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 以避免异常。

于 2013-10-01T21:33:03.950 回答
0

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

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

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

于 2013-09-27T06:16:02.710 回答