c# - asp.net-mvc(2) 中 Modelbinding double 的 CultureInfo 问题

标签 c# .net asp.net-mvc-2 cultureinfo model-binding

在我的 Jquery 脚本中,我使用使用 . 作为分数分隔符的浏览器 CultureInfo (en-UK) 发布两个 double 。我的 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);
}

由于解析问题,模型绑定(bind)失败。

我认为最好将我的 javascript 设置为 en-UK,并将我的 MVC 应用程序中的模型绑定(bind)设置为相同。但是我也不知道怎么办。
有什么建议吗?

最佳答案

我不确定默认模型绑定(bind)器 (DefaultModelBinder) 的本地化程度如何,但您可以轻松地自己创建一个绑定(bind)器来处理特定于文化的数据解析,例如,创建一个新类,我们称它为DoubleModelBinder,复制以下内容:

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 接口(interface)时,我们需要创建一个 BindModel 方法。这是它的主要内容,但在我们可以解析任何内容之前,我们需要根据浏览器的语言获取一个 IFormatProvider。因此,我们使用 GetUserCulture 方法来尝试准备好浏览器的语言。如果我们不能恢复到当前的文化。

当我们有了它时,我们就可以解析这个值了。我们首先从 ValueProvider(它实际上是许多值提供者的组合,例如来自 Form 集合、Request 集合等)中获取它,然后我们使用发现的 IFormatProvider 解析它,这就是我们现在拥有的 CultureInfo。

完成后,将其添加到模型 Binder 集合就非常简单了;

ModelBinder.Binders[typeof(Double)] = new DoubleModelBinder();

尝试一下,看看是否有帮助。

关于c# - asp.net-mvc(2) 中 Modelbinding double 的 CultureInfo 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3168652/

相关文章:

c# - POS机与银行之间的支付

c# - Windows Phone 8 Geolocator 无法设置 desiredAccuracy = High 并绑定(bind)到 PositionChanged 事件

c# - Interlocked.Increment 溢出会导致 .NET 运行时损坏吗?

c# - 创建针对 .Net Framework 4.5 和 .Net Standard 的库

asp.net - 如何使用和/或本地化 DisplayAttribute 与 ASP.NET MVC2?

c# - 当我实现一个基类也实现的接口(interface)时,为什么我没有收到编译器警告?

c# - 从实异常(exception)部将属性设置为 null

c# - c# 中实现优先队列最快的集合是什么?

asp.net-mvc - ASP.NET MVC : Is Data Annotation Validation Enough?

asp.net-mvc - 在 ASP MVC 中,如何向用户返回新 View 和文件?