ASP Net MVC - 验证消息的本地化

7

我是一个有用的助手,可以翻译文本。

我的asp net mvc 5 应用程序中遇到了本地化验证消息的问题。

我使用以下内容进行本地化:

路由配置:

[Internationalization]
public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute("DefaultLocalized",
        "{language}-{culture}/{controller}/{action}/{id}",
        new
        {
            controller = "Home",
            action = "Index",
            id = "",
            language = "de",
            culture = "DE"
        });

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

LocalizationAttribute:

 class InternationalizationAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string language = (string)filterContext.RouteData.Values["language"] ?? "de";
        string culture = (string)filterContext.RouteData.Values["culture"] ?? "DE";

        Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));
    }
}

模型属性示例:

    [Display(Order = 0, ResourceType = typeof(resourceProjectName.ApplicationStrings), Name = "LabelText")] // this works
    [Required(ErrorMessageResourceType = typeof(resourceProjectName.ApplicationStrings), ErrorMessageResourceName = "ValidationText")] //this does not work
    public string Property { get; set; }

HTML 示例:

这是在 Html.BeginForm 中的内容。如果有些东西缺失或无效,将会在 POST 请求后显示验证消息。

<div>
<div class="form-group row">
    <div>
        @Html.LabelFor(x => x.Property)
    </div>
    <div class="col-sm-6">
        @Html.TextBoxFor(x => x.Property, new { @class = "form-control" })
    </div>
    @if (ViewData.ModelState.Where(i => i.Key.Equals("Property")).Any(x => x.Value.Errors.Any()))
    {
        <div class="col-sm-6">
            @Html.ValidationMessageFor(x => x.Property, "", new { @class = "alert-validation alert-danger" })
        </div>
    }
</div>
</div>

Web.config:

<globalization culture="auto" uiCulture="auto" enableClientBasedCulture="true"/>

除了验证消息以外,本网站的所有内容都适用于本地化。

验证消息总是显示与浏览器语言设置匹配的资源字符串,即使用户导航到例如:site.de/en-EN/test。

web.config有问题吗?我尝试将enableClientBasedCulture设置为false,但问题仍然存在。

祝好, Martin

1个回答

3
我已经在这里找到了解决方案:http://afana.me/post/aspnet-mvc-internationalization.aspx。我的做法是移除“国际化”属性,并创建一个“BaseController”类,在每个请求中执行与“国际化”属性相同的操作。
BaseController:
 public class BaseController : Controller
{
    protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
    {
        //Localization in Base controller:

        string language = (string)RouteData.Values["language"] ?? "de";
        string culture = (string)RouteData.Values["culture"] ?? "DE";

        Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));


        return base.BeginExecuteCore(callback, state);
    }
}

现在标签和验证消息的本地化已经可行。


1
我曾经遇到过类似的问题,使用了不同的文章,结果发现我忘记引用jquery-validate和jquery-validate-unobtrusive,希望这也能帮助其他人。 - Sudani
这对我也起作用了。我正在使用一个属性,似乎一些(奇怪的是,并不总是)模型在请求管道的不同部分进行验证,因此这为某些身份视图模型修复了问题,而其他视图模型则没有这个问题。 - Andrew Grothe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接