代码之家  ›  专栏  ›  技术社区  ›  Pawel Krakowiak

如何全球化ASP.NET MVC视图(尤其是十进制分隔符)?

  •  5
  • Pawel Krakowiak  · 技术社区  · 16 年前

    我正在和 NerdDinner 样品 application 到达了虚拟地球图处理区。应用程序存储经度和纬度的一些值。不幸的是,在我的系统中,浮点数是以逗号作为十进制分隔符存储的,而不是像美国那样的点。所以如果我的纬度是47.64,它会被检索并显示为47.64。由于该值是在对虚拟地球API的函数调用中传递的,因此在该点上失败(例如,javascript API预期 47.64,-122.13 但得到 47、64、-122、13 )

    我需要确保应用程序总是使用点。在webforms应用程序中,我有一个公共类,它重写 System.Web.UI.Page.InitializeCulture() 方法和我将从该类继承页面。

    我不知道如何对MVC做同样的事情。我需要定制的吗 ViewPage 还是什么?有没有 容易的 解决这个问题的方法?例子?

    5 回复  |  直到 14 年前
        1
  •  2
  •   Pawel Krakowiak    15 年前

    因为设置 <globalization/> 对en-us毫无帮助,我决定创建一个自定义类,该类初始化适当的区域性设置,并确保所有需要此行为的视图都继承自我的自定义类。

    nerddinnerview页面.cs:

    using System.Globalization;
    using System.Threading;
    using System.Web.Mvc;
    
    namespace NerdDinner.Views
    {
        public class NerdDinnerViewPage<T> : ViewPage<T> where T : class
        {
            protected override void InitializeCulture()
            {
                base.InitializeCulture();
    
                Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentCulture.Clone() as CultureInfo;
    
                if (Thread.CurrentThread.CurrentCulture != null)
                {
                    Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator = ".";
                    Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator = ".";
                }
            }
        }
    }
    

    Edit.aspx:

    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="NerdDinner.Views.NerdDinnerViewPage<NerdDinner.Models.DinnerFormViewModel>" %>
    
        2
  •  2
  •   Finn Vilsbæk    15 年前

    我是一名丹麦开发商,面临着完全相同的问题。我发现了一个有效的解决方案,KristofNeirynck在他的Dev博客上很好地描述了这一点:

    Custom Model Binder

    顺祝商祺,芬·维尔斯贝克

        3
  •  0
  •   Steve    15 年前

    当你说

    在我的系统中,浮点数以逗号作为十进制分隔符存储。

    我想你是说他们是 格式化的 使用逗号,浮点数存储为 float .

    虽然您可以通过设置区域性来解决格式化问题,“真正的”解决方法是更改代码。好吧,这不是您的代码,所以您可能不想在这个场合这样做,但是作为一般参考,您需要确保在格式化浮动或其他任何情况时使用适当的区域性。在为API使用的数字设置格式的情况下,您将使用不变量区域性。

    即使用 foo.ToString(CultureInfo.InvariantCulture) 而不是 foo.ToString() 同样,当使用string.format(…)时。

    编辑 我刚刚看了一下nerddinner代码,发现这个错误在javascript中,而不是在C中,所以上面的代码没有帮助。我不知道是否可以在javascript中格式化数字,但我认为真正的解决方案是修复模型代码以返回正确格式化的字符串。

    编辑2 我建议您尝试以下方法: 在 SearchController.cs 改变 Latitude Longitude 在里面 JsonDinner strings . 即

    public class JsonDinner {
        public int      DinnerID    { get; set; }
        public string   Title       { get; set; }
        public string   Latitude    { get; set; }
        public string   Longitude   { get; set; }
        public string   Description { get; set; }
        public int      RSVPCount   { get; set; }
    }
    

    然后向下滚动到searchbylocation方法并更改lat/long行以正确格式化javascript的字符串:

    Latitude = dinner.Latitude.ToString(CultureInfo.InvariantCulture),
    Longitude = dinner.Longitude.ToString(CultureInfo.InvariantCulture),
    

    这就意味着你不需要你提出的解决方法,而应该解决你的另一个问题…我将在这里发表评论。希望这有帮助,我还没有完全测试,因为我不在您的地方,但它显然是有效的。

        4
  •  0
  •   Jonas Stensved    14 年前

    我在模板编辑器中使用了一个简单的快速修复程序。我的应用程序只使用瑞典语(逗号作为十进制分隔符),所以它是一个字符串。请替换,但您当然可以使它了解多种文化。

    在我的视图/shared/editoremplates/decimal.ascx中:

        5
  •  0
  •   cederlof    14 年前

    我在javascript方面解决了这个问题,确保传递到地图库的是使用点(.),以及填充回文本框的是使用逗号(,)。显然,这不是为了本地化,而是一个快速修复。

    MAP JS 在CallbackForLocation中:

    //If we've found exactly one place, that's our address.
    if (points.length === 1) {
        $("#Latitude").val(points[0].Latitude.toString().replace('.', ','));
        $("#Longitude").val(points[0].Longitude.toString().replace('.', ','));
    }
    

    APCX 在jquery-ready()中:

        var latitude = <%=Model.Latitude.ToString().Replace(',', '.')%>;
        var longitude = <%=Model.Longitude.ToString().Replace(',', '.')%>;