gpt4 book ai didi

c# - 服务器端验证本地化不同于客户端

转载 作者:太空宇宙 更新时间:2023-11-03 13:18:21 26 4
gpt4 key购买 nike

虽然这也可能与其他主题有关,但我只是解决以下验证问题:

模型注释、 Controller 和 Action

我使用来自 System.ComponentModel.DataAnnotations 的验证属性.模型看起来像

public class NewUserModel
{
[Required]
public string Username { get; set; }
}

所以,没什么特别的。据此,一个几乎默认的 Controller 操作

public ActionResult New()
{
return View(new NewUserModel());
}

和 View

@using (Html.BeginForm())
{
@Html.LabelFor(m => m.Username)
@Html.EditorFor(m => m.Username)
@Html.ValidationMessageFor(m => m.Username)
<button type="submit">save</button>
}

使用过滤器设置文化

根据用户偏好,通过以下过滤器设置文化

public class CultureFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext filterContext)
{
// simplified for this example
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("de");
}
}

这是在 global.asax 中注册的

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new CultureFilter());
}

默认语言是英文,所以web.config包含

<globalization culture="en-US" uiCulture="en"/>

完成后,客户端验证就可以完美运行了。不显眼的 jQuery 验证的数据属性已本地化,如您在生成的 HTML 中所见:

<input data-val="true"
data-val-required="Das Feld Username ist erforderlich."
id="Username" name="Username" type="text" value="" />

问题:没有本地化的服务器端验证

问题是,通过禁用 JavaScript 强制服务器端验证会呈现以下未本地化 验证消息,而数据属性仍然是本地化的:

<input data-val="true"
data-val-required="Das Feld Username ist erforderlich."
id="Username" name="Username" type="text" value="" />
<span class="field-validation-error" data-valmsg-for="Username"
data-valmsg-replace="true">The Username field is required.</span>

看起来很有趣,不是吗? ;-)

我尝试了什么?

首先,我检查了服务器端文化是否由 web.config 设置。是的。如果我更改 <globalization/>属性为德国文化(或者只是删除节点,因为系统语言是德语),服务器端验证消息也是德语。

这让我相信服务器端和客户端从资源中获取消息的时间可能会有所不同。也许服务器端会在执行操作之前执行此操作,这意味着 CultureFilter.OnActionExecuting()在那之后被调用,在这种情况下当然为时已晚。

所以我尝试根据开始请求设置区域性 (global.asax):

protected void Application_BeginRequest()
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("de");
}

嗯,成功了。但我真的认为这是一个丑陋的解决方案。所以……

问题:我说得对吗?我还有其他选择吗?

服务器端验证在过滤器设置区域性之前从资源中获取消息是真的吗?如果不是,我做错了什么?如果是,是否有比 global.asax“hack”更简洁的文化设置选项?

提前谢谢你。

最佳答案

问题是 DefaultModelBinder 在执行您的Filter 之前创建了模型,并且在创建模型的过程中添加了验证错误(此时区域性是在 web.config 文件中定义的 en-US

一个选项可能是创建自定义 ModelBinder(并将其注册为 DefaultModelBinder)并覆盖 OnPropertyValidating() 方法以设置文化。

关于c# - 服务器端验证本地化不同于客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25224588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com