用于十进制数的DataAnnotation DisplayFormat

时间:2013-05-13 13:16:21

标签: asp.net-mvc data-annotations

我有他的代码。 PartialView。

<div class="input width110">
    @Html.EditorFor(x => x.Price, @Html.Attributes(@class: "right_text_align", @disabled: "true", @id: "Price"))
</div>

模型。

public class ServiceModel
{
 [DisplayFormat(DataFormatString = "{0:0.00}", ApplyFormatInEditMode = true)]
 public decimal Price { get; set; }
}

控制器

public ActionResult SetService(ServiceModel model, string action)
{

            if (ModelState.IsValid)
            {
               /*Does smthg.*/
               ModelState.Clear(); 
            }

       return View("Index", rcpModel); 
       //Index is main view, which holds partialView
       //rcpModel holds, model
 }

视图加载时Decimal以“0.00”格式显示。但是在发布后,当modelState为无效数字时,以“0.0000”格式显示。如果模型状态有效,一切顺利。有没有人遇到类似的东西?

2 个答案:

答案 0 :(得分:1)

如果您有javascript修改文本框(货币格式或逗号)上的值,那么您可能会遇到绑定错误,因为它将表现为字符串。试试这个:

为小数值创建BindingProperty

public class DecimalModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext,
                            ModelBindingContext bindingContext)
    {
        var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        var modelState = new ModelState { Value = valueResult };
        object actualValue = null;
        try
        {
            actualValue = Convert.ToDecimal(valueResult.AttemptedValue,
                                            CultureInfo.CurrentCulture);
        }
        catch (FormatException e)
        {
            modelState.Errors.Add(e);
        }

        bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
        return actualValue;
    }
}

在您的global.asax app_start或WebActivator.PostApplicationStartMethod上添加一个条目以注册自定义活页夹:

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());

答案 1 :(得分:0)

显示点而不是逗号足以在调用视图之前使用的代码的每个点将文化更改为英语。

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("En");