【发布时间】:2015-12-11 17:43:38
【问题描述】:
我正在尝试构建一个多语言 MVC 应用程序。我的申请中有一个表格,我有输入费用的字段。我能够使用西班牙文化创造记录。
但是在尝试更新记录时,我得到 jquery 验证错误。我收到一条默认错误消息:
该字段必须是数字。
在我的视图模型中,我设置了以下属性。
[LocalizedDisplayName("Label_Cost")]
[RegularExpression("^[^<>,<|>]+$", ErrorMessage = null, ErrorMessageResourceName = "Error_Message_Html_Tags_Prevented", ErrorMessageResourceType = typeof(Resources))]
[Range(0, 9999.99, ErrorMessage = null, ErrorMessageResourceName = "Error_Message_Cost_Not_Valid", ErrorMessageResourceType = typeof(Resources))]
public decimal? Cost { get; set; }
我已经在我的 Gobal.asax 文件中设置了以下内容
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
try
{
HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("CurrentCulture");
string culutureCode = cookie != null && !string.IsNullOrEmpty(cookie.Value) ? cookie.Value : "en";
CultureInfo ci = new CultureInfo(culutureCode);
System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
System.Threading.Thread.CurrentThread.CurrentCulture =
CultureInfo.CreateSpecificCulture(ci.Name);
}
catch(Exception ex)
{
// Code
}
}
上面的方法在服务器端按预期工作,改变了文化。但是客户端验证在非英语文化中中断,因为 javascript 只识别十进制文字。我想知道使用特定文化验证扩展 mvc 客户端验证的最佳方式。
编辑
参考 Mike 的网址,我在 Js 包中进行了以下更改。 js包如下
public static void RegisterBundles(BundleCollection bundles)
{
BundleTable.EnableOptimizations = true;
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js"));
bundles.Add(new ScriptBundle("~/bundles/globalisation").Include(
"~/Scripts/globalize.js",
"~/Scripts/globalize/currency.js",
"~/Scripts/globalize/date.js",
"~/Scripts/globalize/message.js",
"~/Scripts/globalize/number.js",
"~/Scripts/globalize/plural.js",
"~/Scripts/globalize/relative-time.js"));
bundles.Add(new ScriptBundle("~/bundles/globalisationEN").Include(
"~/Scripts/GlobalisationCulture/globalize.culture.en-AU.js"));
bundles.Add(new ScriptBundle("~/bundles/globalisationES").Include(
"~/Scripts/GlobalisationCulture/globalize.culture.es-AR.js"));
bundles.Add(new ScriptBundle("~/bundles/jqueryuiEN").Include(
"~/Scripts/jquery-ui-1.10.3.js"));
bundles.Add(new ScriptBundle("~/bundles/jqueryuiES").Include(
"~/Scripts/jquery-ui-1.10.3.js"));
bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
"~/Scripts/jquery.validate.js",
"~/Scripts/jquery.validate.unobtrusive.js",
"~/Scripts/jquery.unobtrusive-ajax.js",
"~/Scripts/jquery.validate.globalize.js"));
}
在布局页面中我已经实现如下
HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("CurrentCulture");
string culutureCode = cookie != null && !string.IsNullOrEmpty(cookie.Value) ? cookie.Value : "en";
if (culutureCode.Equals("en-AU", StringComparison.OrdinalIgnoreCase))
{
culutureCode = "EN";
}
else if (culutureCode.Equals("es-AR", StringComparison.OrdinalIgnoreCase))
{
culutureCode = "ES";
}
else
{
culutureCode = "EN";
}
@Scripts.Render("~/bundles/jquery",
"~/bundles/globalisation",
string.Format("~/bundles/globalisation{0}", culutureCode),
"~/bundles/jqueryval",
string.Format("~/bundles/jqueryui{0}", culutureCode))
【问题讨论】:
-
我个人不擅长文化信息,但您可能想要使用
catch,将其扩展为包含一般异常,并将其写入控制台(用于调试目的):` catch (异常错误) { Console.WriteLine(err); }` 祝你好运! -
您是否研究过类似问题中给出的解决方案:stackoverflow.com/questions/5199835/…
-
为什么你会空捕获异常然后要求 SO 解决这个问题?
-
@Mike 是的,我试过了,但对我不起作用。
-
您似乎在混合 jquery globalize 脚本。 jQuery globalize 1.0.0 使用
currency.js、number.js、plural.js等。但它适用于文化的 cldr 文件。globalize.culture.es-AR.jsetc etc 与 jquery globalize 0.1.x 有关。
标签: c# asp.net-mvc validation asp.net-mvc-4 globalization