我已将Action Filer中的文化设置为
Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
其中culture = {fr-be} =>法国比利时。
仅供参考,此动作过滤器根据用户选择设置文化。
myAction用户之一以格式[dd / mm / yyyy] =>格式输入日期26/7/2011。 行动如下
public ActionResult RequestVacation(VacationRequest model)
{
if(ModelState.IsValid)
{
...
当我dubug代码模型.VacationDate包含01/01/0001;虽然应该是7/26/2011 而Form [VacationDate]包含26/07/2011 [以Fr-BE格式] 并且ModelState.IsValid为false;虽然它应该是真的,因为日期在fr-be格式中是正确的。 当我挖掘但在视觉工作室检查当地人 我找到了
this.ModelState[1].Culture = {en-US}
然而我已经使用actionFilter设置了文化值,如上所述。 我的问题是如何设置this.ModelState.Culture = {fr-be}?
答案 0 :(得分:4)
回答你的问题有点迟了但是我想现在发生的事情是你在动作过滤器的OnActionExecuting方法中设置当前的线程文化,但模型绑定在此之前发生,所以它没有回升你的改变。
在模型绑定发生之前,例如在Application BeginRequest方法中,您需要将设置文化的代码移动到管道中的早期,如果需要将文化存储在会话中,则需要移动AcquireRequestState。 / p>
答案 1 :(得分:2)
将以下内容放入web.config中:
<configuration>
<system.web>
<globalization
fileEncoding="utf-8"
requestEncoding="utf-8"
responseEncoding="utf-8"
culture="fr-BE"
uiCulture="fr-BE"
/>
</system.web>
</configuration>
答案 2 :(得分:0)
在回答上述问题时,我已经用这种方式解决了这个问题
if (ModelState.Keys.Contains("VactionDate"))
{
ModelState err = ModelState["VactionDate"];
if (!err.Value.Culture.Equals(Thread.CurrentThread.CurrentCulture))
{
try
{
DateTime dt = Convert.ToDateTime(err.Value.AttemptedValue, Thread.CurrentThread.CurrentCulture.DateTimeFormat);
model.VactionDate = dt;
ModelState.Remove("VactionDate");
}
catch
{
}
}
}
我知道这不是一个好的解决方案。但在验证发生之前,我还在寻找一些改变方法,
ModelState[n].Value.Culture = {en-US}
要
ModelState[n].Value.Culture = {fr-BE}
其中{fr-BE}是我需要的文化,用于解析dateTime。 所以我仍然在找人找一个好的解决方案。