在 ASP.NET MVC 应用程序中,更改 Thread.CurrentThread.CurrentCulture[UI] 可以改变 MVC 从资源中挑选消息的方式。在我为呈现问题而创建的示例应用程序中,有两个资源文件 - 用于英语消息的 Res.resx 和用于西班牙语消息的 Res.es.resx。
但是,模型验证产生的错误消息始终以英文显示。
我的问题是,如何控制模型验证错误消息的显示语言?
下面是我编写的示例应用程序的一部分(基于默认的 ASP.NET MVC 应用程序)来演示这个问题。
它在浏览器中的外观截图:
https://dl.dropboxusercontent.com/u/4453002/SO_LanguageOfValidation.png
ViewModel 和控制器 - HomeController.cs :
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Threading;
using System.Web.Mvc;
namespace SO_ValidationMessageInEnglish.Controllers {
/// <summary>
/// A very basic view model.
/// </summary>
public class ViewModel {
[Display(Name = "Message", ResourceType = typeof(Res))]
[DisplayName("Message")]
[Required(AllowEmptyStrings = false, ErrorMessageResourceName = "MessageRequired", ErrorMessageResourceType = typeof(Res))]
public string Message { get; set; }
public string Language { get; set; }
}
public class HomeController : Controller {
public ActionResult Index(string language = "en") {
Thread.CurrentThread.CurrentCulture = new CultureInfo(language);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(language);
return View();
}
[HttpPost]
[ActionName("Index")]
public ActionResult IndexPost(ViewModel foo) {
Thread.CurrentThread.CurrentCulture = new CultureInfo(foo.Language ?? "en");
Thread.CurrentThread.CurrentUICulture = new CultureInfo(foo.Language ?? "en");
return View(foo);
}
}
}
查看 - Index.cshtml:
@model SO_ValidationMessageInEnglish.Controllers.ViewModel
@using SO_ValidationMessageInEnglish
@{ ViewBag.Title = Res.Title; }
@Res.CurrentMessage:<br />
<h2>@((Model != null) ? Model.Message : Res.Default)</h2>
<p />
@using (Html.BeginForm("Index", "Home", FormMethod.Post, null)) {
@Html.LabelFor(m => m.Message)
@Html.TextBoxFor(m => m.Message)
@Html.HiddenFor(m => m.Language)
@Html.ValidationMessageFor(m => m.Message)
<input type="submit" value="@Res.Submit" />
}