Comment globaliser ASP.NET vues MVC (séparateurs décimaux en particulier)?

je travaille avec le NerdDinner sample application et je suis arrivé à la section qui traite de la carte de la Terre virtuelle. L'application stocke certaines valeurs pour la longitude et la latitude. Malheureusement, sur mon système, des nombres à virgule flottante sont stockés avec une virgule comme séparateur décimal, pas un point comme aux états-unis. Donc, si j'ai une latitude de 47.64 c'est récupérée et affichée comme 47,64. Parce que la valeur est passée dans un appel de fonction à L'API de la Terre virtuelle, il échoue à ce moment-là (par exemple, L'API JavaScript attend 47.64, -122.13 , mais obtient 47,64, -122,13 ).

je dois m'assurer que l'application utilise toujours des points. Dans une application WebForms, j'aurais une classe commune qui supplante la méthode System.Web.UI.Page.InitializeCulture() et j'hériterais mes pages de cette classe.

Je ne suis pas sûr de savoir comment faire la même chose avec MVC. Ai-je besoin d'une personnalisation de l' ViewPage ou quelque chose? Y a-t-il une façon facile de résoudre ce problème? Des exemples?

5
demandé sur Pawel Krakowiak 2009-04-17 16:43:12

5 réponses

parce que définir <globalization/> à en-US n'a pas aidé du tout j'ai décidé de créer une classe personnalisée qui initialise les paramètres de culture appropriés et s'assurer que toutes les vues qui exigent ce comportement sont héritées de ma classe personnalisée.

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
répondu Pawel Krakowiak 2009-04-27 12:24:48

je suis un développeur danois et je faisais face exactement le même problème. J'ai trouvé une solution qui a été gentiment décrite par Kristof Neirynck sur son Blog dev:

Modèle De Liaison Personnalisé

meilleures salutations, Finn Vilsbaek

2
répondu 2009-08-15 10:45:59

quand vous dites

sur mon système des nombres à virgule flottante sont stockés avec une virgule comme séparateur décimal

je suppose que vous voulez dire qu'ils sont formaté avec une virgule, Les Nombres à virgule flottante sont stockés comme float .

alors que vous pouvez aborder la question du formatage en définissant les Cultures, la" vraie " solution est de changer le code. OK, ce n'est pas ton code alors peut-être que vous ne voulez pas faire cela à cette occasion, mais pour référence générale vous devez vous assurer que lors du formatage des flotteurs ou autre chose vous utilisez la culture appropriée. Dans le cas de fomater un nombre à utiliser par une API, vous utiliserez la culture invariant.

i. e. utilisez foo.ToString(CultureInfo.InvariantCulture) au lieu de foo.ToString() et de même en utilisant string.Format.(..).

Edit je viens de jeter un oeil au Code NerdDinner et ont réalisé que cette erreur est dans le Javascript pas dans C#, donc mon code ci-dessus ne va pas aider. Je ne sais pas s'il est possible de formater des nombres en Javascript, mais la vraie solution que je pense est de corriger le code de modèle pour retourner une chaîne correctement formatée.

Edit 2 , je vous suggère d'essayer le suivant: Dans le SearchController.cs remplacer le Latitude et Longitude dans JsonDinner par strings . c'est à dire

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; }
}

puis faites défiler vers le bas jusqu'à la méthode de localisation et changez les lignes Lat/Long pour formater les chaînes correctement pour JavaScript:

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

cela devrait signifier que vous n'avez pas besoin de la correction que vous mettez en, et devrait corriger votre autre question... où je vais laisser un commentaire. Espérons que cela aide, je n'ai pas entièrement testé est que je ne suis pas dans votre langue, mais il semble bien fonctionner.

0
répondu Steve Haigh 2009-04-28 14:33:06

j'utilise un simple quickfix dans The TemplateEditor. Mon application utilise uniquement le suédois (virgule comme séparateur décimal) donc c'est une chaîne simple.Remplacer mais vous pourriez bien sûr le rendre conscient de la multiplicité des cultures.

In my Views/Shared/Editoremplates/Decimal.ascx:

0
répondu Jonas Stensved 2010-05-24 10:32:59

j'ai corrigé cela du côté JavaScript à la place, en m'assurant que ce qui est passé dans la map-library utilise des points (.), et ce qui est retourné dans les zones de texte utilise commas (,). Évidemment, ce n'est pas fait pour la localisation, mais une solution rapide.

de la Carte.js in 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('.', ','));
}

de la Carte.ascx dans le jquery-ready ():

    var latitude = <%=Model.Latitude.ToString().Replace(',', '.')%>;
    var longitude = <%=Model.Longitude.ToString().Replace(',', '.')%>;
0
répondu cederlof 2010-11-23 12:50:49