Как глобализировать представления ASP.NET MVC (в частности, десятичные разделители)? - PullRequest
5 голосов
/ 17 апреля 2009

Я работаю с NerdDinner сэмплом приложения и попал в раздел, посвященный карте Виртуальной Земли. Приложение хранит некоторые значения для долготы и широты. К сожалению, в моей системе числа с плавающей запятой хранятся с запятой в качестве десятичного разделителя, а не с точкой, как в США. Так что, если у меня есть широта 47,64, она будет восстановлена ​​и отображена как 47,64. Поскольку это значение передается при вызове функции в API Virtual Earth, в этот момент происходит сбой (например, JavaScript API ожидает 47,64, -122,13 , но получает 47,64, -122,13 ).

Мне нужно убедиться, что приложение всегда использует точки. В приложении WebForms у меня будет общий класс, который переопределяет метод System.Web.UI.Page.InitializeCulture(), и я буду наследовать свои страницы от этого класса.

Я не уверен, как сделать то же самое с MVC. Нужно ли настраивать ViewPage или что-то? Есть ли простой способ решить эту проблему? Примеры?

Ответы [ 5 ]

2 голосов
/ 27 апреля 2009

Поскольку установка <globalization/> на en-US совсем не помогла, я решил создать собственный класс, который инициализирует правильные настройки культуры и следит за тем, чтобы все представления, требующие этого поведения, были унаследованы от моего пользовательского класса.

NerdDinnerViewPage.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 голосов
/ 15 августа 2009

Я датский разработчик и столкнулся с точно такой же проблемой. Я нашел рабочее решение, которое любезно описал Кристоф Нейринк в своем блоге разработчика:

Пользовательская модель Binder

С уважением, Финн Вилсбек

0 голосов
/ 23 ноября 2010

Вместо этого я исправил это на стороне JavaScript, убедившись, что то, что передается в библиотеку карт, использует точки (.), А то, что возвращается в текстовые поля, - запятыми (,). Очевидно, что это не для локализации, а для быстрого исправления.

Map.js в обратном вызове. Расположение:

//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('.', ','));
}

Map.ascx в jquery-ready ():

    var latitude = <%=Model.Latitude.ToString().Replace(',', '.')%>;
    var longitude = <%=Model.Longitude.ToString().Replace(',', '.')%>;
0 голосов
/ 24 мая 2010

Я использую простой ярлык в TemplateEditor. Мое приложение использует только шведский язык (запятая в качестве десятичного разделителя), так что это одна строка. Замените, но вы, конечно, могли бы знать о нескольких культурах.

В моих представлениях / Shared / EditorTemplates / Decimal.ascx:

0 голосов
/ 17 апреля 2009

Когда вы говорите

в моей системе числа с плавающей запятой хранятся с запятой в качестве десятичного разделителя

Полагаю, вы имеете в виду, что они отформатированы с запятой, числа с плавающей запятой хранятся как float.

Хотя вы можете решить проблему с форматированием, установив Cultures, «реальным» решением будет изменение кода. Хорошо, это не ваш код, поэтому, возможно, вы не хотите делать это в этом случае, но для общего ознакомления вы должны убедиться, что при форматировании с плавающей запятой или чем-то еще вы используете соответствующую культуру. В случае форматирования числа для использования API вы должны использовать InvariantCulture.

т.е. используйте 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),

Это должно означать, что вы не нуждаетесь в исправлении, которое вы вставили, и должны исправить ваш другой вопрос ... где я оставлю комментарий. Надеюсь, это поможет, я не полностью проверил, так как я не в вашей стране, но, похоже, это работает.

...