asp.net mvc 5 中的逗号小数点分隔符
comma decimal seperator in asp.net mvc 5
我拼命想让 asp.net 使用逗号作为小数点分隔符,但这似乎比必要的要难得多...
我已经完成了本教程中的所有内容http://www.asp.net/mvc/overview/getting-started/introduction/examining-the-edit-methods-and-edit-view
在根网络配置中试过这个
<system.web>
<globalization culture="de-DE" uiCulture="de-DE" />
</system.web>
单步执行 jQuery 代码 - 那里的全球化似乎奏效了。
我正在使用带有模型视图控制器的获取请求,如下所示
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; }
}
在主控制器中调用了 get 请求 - 因此这加强了我的假设,即 jquery 文化相关验证正在工作,并且 .net 文化中的某些东西是错误的,即使 Thread.CurrentTHread.CurrentCulture / CurrentUICulture 也设置正确。
当我尝试填写 3,0 作为高度时,我收到以下错误消息:
值“3,0”对高度无效。
这是我观点的重要部分:
@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>
}
这是我的主控制器:
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);
}
我已经进入模特状态,不知何故文化与我现在的文化不同
您的值是 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());
我想现在应该可以了。 :)
我知道是旧的但我遇到了同样的问题(使用 es-AR)并且我找到了更好的解决方案,你可以简单地这样做:
void Application_AcquireRequestState(object sender, EventArgs e)
{
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(HttpContext.Current.Session["userCulture"]);
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(HttpContext.Current.Session["userCulture"]);
}
在 Global.asax
此代码在模型绑定之前运行,因此您可以将文化信息设置到线程,并且您还可以访问会话变量(针对特定用户文化)
我拼命想让 asp.net 使用逗号作为小数点分隔符,但这似乎比必要的要难得多...
我已经完成了本教程中的所有内容http://www.asp.net/mvc/overview/getting-started/introduction/examining-the-edit-methods-and-edit-view
在根网络配置中试过这个
<system.web>
<globalization culture="de-DE" uiCulture="de-DE" />
</system.web>
单步执行 jQuery 代码 - 那里的全球化似乎奏效了。
我正在使用带有模型视图控制器的获取请求,如下所示
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; }
}
在主控制器中调用了 get 请求 - 因此这加强了我的假设,即 jquery 文化相关验证正在工作,并且 .net 文化中的某些东西是错误的,即使 Thread.CurrentTHread.CurrentCulture / CurrentUICulture 也设置正确。
当我尝试填写 3,0 作为高度时,我收到以下错误消息:
值“3,0”对高度无效。
这是我观点的重要部分:
@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>
}
这是我的主控制器:
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);
}
我已经进入模特状态,不知何故文化与我现在的文化不同
您的值是 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());
我想现在应该可以了。 :)
我知道是旧的但我遇到了同样的问题(使用 es-AR)并且我找到了更好的解决方案,你可以简单地这样做:
void Application_AcquireRequestState(object sender, EventArgs e)
{
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(HttpContext.Current.Session["userCulture"]);
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(HttpContext.Current.Session["userCulture"]);
}
在 Global.asax
此代码在模型绑定之前运行,因此您可以将文化信息设置到线程,并且您还可以访问会话变量(针对特定用户文化)