c#-ModelState.IsValid仅在资源语言更改时返回false?

c#-ModelState.IsValid仅在资源语言更改时返回false?,c#,asp.net-mvc-4,razor,entity-framework-6,C#,Asp.net Mvc 4,Razor,Entity Framework 6,我的razor视图中有一个字段,如下所示 @Html.TextBoxFor(model => model.Duration, new { @class = "form-control txtSite input-large rounded-custom", name = "Duration", @type = "number", min = "0", id = "durationId", required = "true", Tabindex = "1", value = "0" })

我的razor视图中有一个字段,如下所示

 @Html.TextBoxFor(model => model.Duration, new { @class = "form-control txtSite input-large rounded-custom", name = "Duration", @type = "number", min = "0", id = "durationId", required = "true", Tabindex = "1", value = "0" })
 @Html.ValidationMessageFor(model => model.Duration, "", new { style = "color: red" })
我在MVC中使用了实体模型结构。字段持续时间在数据库表“Activity”(与我在razor上使用的模型相同)中定义为Float。但实体元数据显示为Double,如下所示

  public Nullable<double> Duration { get; set; }
奇怪的是,当用于显示标签的资源语言为英语时,我的代码对浮点值很有效,而当我将其更改为另一种语言(法语)时,代码不起作用。此处ModelState.IsValid返回false。我得到了错误的答案

"The value 3.5(any float value) is invalid for Duration." 

如何为另一种资源语言修复它?。任何帮助都将不胜感激

您可以像这样轻松覆盖您的global.asax.cs文件

[HttpPost]
public ActionResult AddActivity(Activity model)
{
    if (ModelState.IsValid)
        {
          //Some Code
        }
}
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
     //Create culture info object 
     CultureInfo ci = new CultureInfo("en");

     if(Request.Url.Host.Equals("yourdomain.com",                                   StringComparison.InvariantCultureIgnoreCase))
     {
          ci = new CultureInfo("fr"); //in your case
     }

     System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
     System.Threading.Thread.CurrentThread.CurrentCulture =                                     CultureInfo.CreateSpecificCulture(ci.Name);
}
也可以在begin_请求方法中设置

更多信息,请查看此链接
您会遇到该错误,因为您的站点的区域性设置为不使用点
作为小数分隔符的语言(法语)。但是,
Duration
的条目中有一个点,因此模型的状态评估为无效

换句话说,您的站点(服务器端)是法国文化的,但您使用的浏览器或任何客户端都不是法语的


修复

您需要在每个请求上同步客户端和服务器的语言:确保为每个请求执行设置区域性的代码,而不仅仅是在应用程序启动时执行。用户可以在请求之间切换语言。将
CurrentCulture
设置为适当的语言将使用该语言的数字格式、日期时间格式等

此外,建议但不要求修复您的问题,您还应设置
CurrentUICulture
,它将从您的资源文件中获取该语言的标签、消息等(如果您有任何资源文件)


按照上面的@orhun.begendi answer设置上述两项。

参考本博客。法国人不要用逗号表示点(3,5)而不是句号(3.5)。@Dave Becker-是的,你说得对,但在数据库方面,我认为它是浮点数。我是否将其更改为字符串?@KulOmkar您可能需要在服务器端(法语)设置格式,以便将值
3.5
输出为
3,5
。请参阅本文:My global.asax.cs已被前面提到的代码覆盖。所有其他文本、日期等都在我的系统上以法语本地语言工作,存在一些指向问题,您可以在请求后检查线程区域性吗?您必须在那里指定,如果您获得其他文化,则存在问题。您还可以通过更改web浏览器的文化信息进行检查。有时像在铬上;在网页上应用的计算机区域性信息,为了进行正确的测试,您必须同时更改该信息。@OmkarKulkarni确保为每个请求执行设置区域性的代码,而不仅仅是在应用程序启动时执行。用户可以在请求之间切换语言。@Coding Yoshi-明白了,我设置区域性的代码只在应用程序启动时执行,因此标签是在该区域性中出现的。是的,我有Common.resx和Common.fr.resx这两个资源文件,我正在使用它们,分别适用于英语和法语版本
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
     //Create culture info object 
     CultureInfo ci = new CultureInfo("en");

     if(Request.Url.Host.Equals("yourdomain.com",                                   StringComparison.InvariantCultureIgnoreCase))
     {
          ci = new CultureInfo("fr"); //in your case
     }

     System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
     System.Threading.Thread.CurrentThread.CurrentCulture =                                     CultureInfo.CreateSpecificCulture(ci.Name);
}