【问题标题】:ASP Net MVC - Localization of Validation MessagesASP Net MVC - 验证消息的本地化
【发布时间】:2016-04-01 09:55:14
【问题描述】:

我在我的 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 }
        );
    }
}

本地化属性:

 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,但问题仍然存在。

亲切的问候, 马丁

【问题讨论】:

    标签: c# asp.net-mvc validation razor localization


    【解决方案1】:

    我在这里找到了解决问题的方法:http://afana.me/post/aspnet-mvc-internationalization.aspx

    我所做的是删除我的“国际化”属性并创建一个“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);
        }
    }
    

    本地化现在适用于标签和验证消息。

    【讨论】:

    • 我在使用不同的文章时遇到了类似的问题,结果是我忘记引用 jquery-validate 和 jquery-validate-unobtrusive,希望这对其他人也有帮助。
    • 这也对我有用。我正在使用一个属性,并且似乎某些(并不总是足够奇怪)模型在请求管道的不同部分进行了验证,因为这解决了某些身份视图模型的问题,而其他视图模型没有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多