asp.net mvc 5中的逗号小数分隔符

时间:2015-07-05 10:20:48

标签: c# jquery asp.net asp.net-mvc globalization

我拼命试图让asp.net使用逗号符号作为小数分隔符,但这似乎要困难得多......

我完成了本教程http://www.asp.net/mvc/overview/getting-started/introduction/examining-the-edit-methods-and-edit-view

中的所有内容

在root web config

中尝试了这个
<system.web>
    <globalization culture="de-DE" uiCulture="de-DE" />
</system.web>

逐步完成jQuery代码 - 全球化似乎有效。

我使用带有模型视图的get请求看起来像这样的

public class SearchCalcViewModel
{
        public SearchCalcViewModel() { }

        public IEnumerable<Calculation> Calculations { get; set; }
        [Display(Name="Name")]
        public string Name { get; set; }
        [Display(Name="Height")]
        public decimal? Height { get; set; }
}

在maincontroller中调用get请求 - 这样就加强了我的假设,即jquery文化依赖验证正在工作,而.net文化中的某些内容是错误的,即使Thread.CurrentTHread.CurrentCulture / CurrentUICulture也正确设置。

当我尝试填写3,0作为高度时,我收到以下错误消息:

价值&#39; 3,0&#39;对高度无效。

这是我观点的导入部分:

@using (Html.BeginForm("Search", "Main", FormMethod.Get))

<div class="form-group">
         @Html.LabelFor(m => m.Height, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
             @Html.TextBoxFor(m => m.Height, new { @class = "form-control"})
             @Html.ValidationMessageFor(m => m.Height)
        </div>
     </div>
}

这是我的MainController:

public ActionResult Search(SearchCalcViewModel searchViewModel)
    {
        searchViewModel.Products = db.Products;
        searchViewModel.Calculations = from c in db.Calculations select c;


        if (searchViewModel.Height.HasValue)
        {
            searchViewModel.Calculations =  searchViewModel.Calculations.Where(c => c.Length == searchViewModel.Height);
        }


        return View(searchViewModel);
    }

我已经进入模范状态,不知何故,文化与我现在的文化有所不同

wrong culture

2 个答案:

答案 0 :(得分:3)

您的值为3,0,这不是有效的十进制类型值。应该3.0替换" comma(,) with dot(.)

编辑:创建自己的模型装订器。

public class DecimalModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        return valueProviderResult == null ? base.BindModel(controllerContext, bindingContext) : Convert.ToDecimal(valueProviderResult.AttemptedValue);

    }    
}

在Application_Start文件中添加这些行。

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

我认为现在应该可行了。 :)

答案 1 :(得分:0)

我知道已经老了,但我有同样的问题(使用es-AR),我找到了更好的解决方案,你可以这么简单:

label

On Global.asax

此代码在模型绑定之前运行,因此您可以将文化信息设置为线程,并且您还可以访问会话变量(对于特定的用户文化)