2009-04-17 12 views
5

Sto lavorando con il campione NerdDinnerapplication e sono arrivato alla sezione che tratta della mappa della Terra virtuale. L'applicazione memorizza alcuni valori per la longitudine e la latitudine. Sfortunatamente sul mio sistema i numeri in virgola mobile sono memorizzati con una virgola come separatore decimale, non un punto come negli Stati Uniti. Quindi se ho una latitudine di 47.64 viene recuperato e visualizzato come 47.64. Poiché tale valore viene passato in una chiamata di funzione all'API Virtual Earth, fallisce in quel momento (ad esempio, l'API JavaScript si aspetta 47.64, -122.13, ma ottiene 47,64, -122,13).Come globalizzare le viste MVC ASP.NET (separatori decimali in particolare)?

Ho bisogno di assicurarmi che l'applicazione usi sempre i punti. In un'applicazione WebForms avrei una classe comune che sovrascrive il metodo System.Web.UI.Page.InitializeCulture() e vorrei ereditare le mie pagine da quella classe.

Non sono sicuro di come fare lo stesso con MVC. Ho bisogno di un ViewPage personalizzato o qualcosa del genere? C'è un modo facile per risolvere questo? Esempi?

+0

Sembra che questo è già connesso come un bug: http : //nerddinner.codeplex.com/WorkItem/View.aspx? WorkItemId = 2616 –

+0

Hm. Forse è un bug? Ho aggiunto al mio web.config per assicurarmi che la cultura sia impostata su en-US application wide, ma non è stata di alcun aiuto, solo dopo che l'ho postata qui. –

risposta

2

Poiché l'impostazione <globalization/> per en-US non ha aiutato affatto ho deciso di creare una classe personalizzata che inizializza le impostazioni di cultura corrette e assicurarsi che tutte le viste che richiedono questo comportamento siano ereditate dalla mia classe personalizzata.

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>" %> 
0

Quando si dice

sul mio sistema numeri in virgola mobile vengono memorizzati con una virgola come separatore decimale

Presumo che significa che essi sono formattato con una virgola, virgola mobile i numeri vengono memorizzati come float.

Mentre è possibile risolvere il problema di formattazione impostando Cultures, la correzione "reale" consiste nel modificare il codice. OK, non è il tuo codice, quindi forse non vuoi farlo in questa occasione, ma per riferimento generale devi assicurarti che durante la formattazione dei float o qualsiasi altra cosa usi la cultura appropriata. Nel caso di fomattare un numero per l'utilizzo di un'API, si utilizzerà InvariantCulture.

I.e. utilizzare foo.ToString(CultureInfo.InvariantCulture) anziché foo.ToString() e allo stesso modo quando si utilizza string.Format (...).

Modifica Ho appena dato un'occhiata al codice NerdDinner e mi sono reso conto che questo errore è nel Javascript non in C#, quindi il mio codice sopra non aiuterà. Non so se sia possibile formattare i numeri in Javascript, ma la soluzione reale che penso sia quella di correggere il codice del modello per restituire una stringa formattata correttamente.

Edit 2 Io suggerirei di provare la seguente: Nel SearchController.cs cambiamento del Latitude e Longitude in JsonDinner a strings. cioè

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

quindi scorrere fino al metodo SearchByLocation e modificare le linee di Lat/Long per formattare le stringhe correttamente per JavaScript:

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

Questo dovrebbe significare che non è necessario la correzione si mette in e dovresti risolvere la tua altra domanda ... dove lascerò un commento. Spero che questo aiuti, non ho completamente testato è come io non sono nel tuo locale, ma certamente sembra funzionare.

+0

Sono nel capitolo 11 di quel libro. Non ho ancora visto la lezione di JsonDinner. :) Grazie per lo sforzo, Steve, lo controllerò presto (e te lo farò sapere)! –

+0

In particolare, sono qui: http://nerddinnerbook.s3.amazonaws.com/Part11.htm –

+1

Ho lavorato fino alla sezione "Integrazione della mappa con Crea e modifica moduli" ed è qui che si interrompe. Probabilmente hai guardato la versione SVN e potrebbe essere un codice diverso. Sto solo seguendo il libro scrivendolo/incollandomi. –

2

Sono uno sviluppatore danese e stava affrontando esattamente lo stesso problema. Ho trovato una soluzione di lavoro che è stato gentilmente descritto da Kristof Neirynck sul suo blog dev:

Custom Model Binder

Con i migliori saluti, Finn Vilsbaek

0

sto usando un semplice quickfix nel TemplateEditor. La mia applicazione utilizza solo lo svedese (virgola come separatore decimale), quindi è una stringa singola. Sostituisci, ma potresti ovviamente renderlo consapevole di più culture.

Nei miei Visualizzazioni/Shared/EditorTemplates/Decimal.ascx: (.) ​​

0

ho fissato questo sul JavaScript lato, invece, facendo in modo che ciò che viene passato per la mappa-libreria utilizza punti e ciò che viene popolato nelle caselle di testo utilizza virgole (,). Ovviamente, questo non è pensato per la localizzazione, ma una soluzione rapida.

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

Map.ascx nel jquery-ready():

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