asp.net-mvc 中模型绑定双精度的 CultureInfo 问题(2)

2024-05-07

在我的 Jquery 脚本中,我使用浏览器的 CultureInfo (en-UK) 发布了两个双打,该浏览器使用.作为分数分隔符。我的 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,复制粘贴以下内容:

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();

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

asp.net-mvc 中模型绑定双精度的 CultureInfo 问题(2) 的相关文章

随机推荐