在我的
Jquery脚本中,我使用浏览器的CultureInfo(en-UK)发布两个双打,它使用.as分数分隔符.我的MVC应用程序在具有区域设置nl-BE的服务器上运行,使用,作为分数分隔符.
[AcceptVerbs(HttpVerbs.Post)] public JsonResult GetGridCell(double longitude,double latitude) { var cell = new GridCellviewmodel { X = (int)Math.Round(longitude,0),Y = (int)Math.Round(latitude,0) }; return Json(cell); }
由于解析问题,模型绑定失败.
我认为最好将我的javascript设置为en-UK,并将其与我的MVC应用中的模型绑定相同.但我不知道该怎么做.
有什么建议?
解决方法
我不确定本地化与默认模型绑定器(DefaultModelBinder)的距离有多远,但您可以自己轻松创建一个可以处理特定于文化的数据解析的绑定器,例如,创建一个新类,让我们称之为DoubleModelBinder,copypasta以下内容:
public class DoubleModelBinder : IModelBinder { /// <summary> /// Binds the value to the model. /// </summary> /// <param name="controllerContext">The current controller context.</param> /// <param name="bindingContext">The binding context.</param> /// <returns>The new model.</returns> public object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext) { var culture = GetUserCulture(controllerContext); string value = bindingContext.ValueProvider .GetValue(bindingContext.ModelName) .ConvertTo(typeof(string)) as string; double result = 0; double.TryParse(value,NumberStyles.Any,culture,out result); return result; } /// <summary> /// Gets the culture used for formatting,based on the user's input language. /// </summary> /// <param name="context">The controller context.</param> /// <returns>An instance of <see cref="CultureInfo" />.</returns> public CultureInfo GetUserCulture(ControllerContext context) { var request = context.HttpContext.Request; if (request.UserLanguages == null || request.UserLanguages.Length == 0) return CultureInfo.CurrentUICulture; return new CultureInfo(request.UserLanguages[0]); } }
现在,我们在这里做的是建立我们自己的语言感知双解析器.当我们实现IModelBinder接口时,我们需要创建一个BindModel方法.这就是它的核心所在,但在我们解析任何东西之前,我们需要根据浏览器的语言获得IFormatProvider.因此,我们使用GetUserCulture方法尝试并准备好浏览器的语言.如果我们不能回归当前的文化.
当我们拥有它时,我们就能够解析价值.我们首先从ValueProvider中获取它(它实际上是许多值提供者的组合,例如来自Form集合,Request集合等),然后我们使用发现的IFormatProvider解析它,这是我们现在拥有的CultureInfo.
一旦你完成了它,将它添加到模型绑定器集合中是非常简单的;
ModelBinder.Binders[typeof(Double)] = new DoubleModelBinder();
试试看,看看是否有帮助.