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

时间:2017-03-21 10:42:09

标签: c# asp.net-mvc-4 razor entity-framework-6

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

 @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; }

我使用部分类作为Activity.cs进行必要的验证,如下所示

 [MetadataTypeAttribute(typeof(Activity.Metadata))]
public partial class Activity
{ 
  internal sealed class Metadata
   {
     [Required(ErrorMessageResourceType = typeof(Resources.Common), ErrorMessageResourceName = "PleaseEnterDuration")]
      public Nullable<double> Duration { get; set; }
   }
}
控制器上的

我的代码就像这样

[HttpPost]
public ActionResult AddActivity(Activity model)
{
    if (ModelState.IsValid)
        {
          //Some Code
        }
}

奇怪的是,当我的资源语言显示标签是英语时,我的代码适用于浮点值,当我将其更改为另一种语言(法语)时,它的效果不正常。其中ModelState.IsValid返回false。我收到错误

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

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

2 个答案:

答案 0 :(得分:2)

您收到该错误是因为您的网站文化设置为不使用点.作为小数点分隔符的语言(法语)。但是Duration的条目中有一个点,因此您的模型状态正在评估为无效。

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

<强>修正

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

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

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

答案 1 :(得分:0)

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

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_request方法中设置。

您可以查看此链接的更多信息 https://www.codeproject.com/articles/778040/beginners-tutorial-on-globalization-and-localizati