Come faccio a rendere solo alcuni specifici campi modello con un InvariantCulture, mentre il resto continua ad usare la cultura degli utenti?

Ho un paio di input nascosti su una vista del mvc asp.net. I loro valori contengono oggetti di tipo double . Voglio che vengano renderizzati con InvariantCulture in quanto sono utilizzati per essere alimentati con un’API (google maps) sul client. Come ora, vengono visualizzati con una virgola (,) come separatore decimale, mentre l’api si aspetta un punto (.) Come separatore decimale.

La soluzione migliore sarebbe se potessi specificare una cultura nell’attributo di annotazione dei dati DisplayFormat sulla proprietà del modello, ma non penso sia ansible:

 public class Position { [DisplayFormat(DataFormatString="{0:G}, CultureInfo.InvariantCulture")] public double Latitude; ... } 

Non posso semplicemente impostare CurrentCulture su InvariantCulture nel mio metodo Application_Start , poiché ci sono altri valori sullo schermo che devono essere nella cultura utente corretta.

Quindi, c’è un modo per cambiare solo temporaneamente la cultura corrente, proprio prima di fare un Html.HiddenFor(Model => Model.Latitude) per quella specifica proprietà, e quindi resettarlo in seguito?

O c’è un altro modo migliore per farlo? Qual è la migliore pratica in merito?

    Un modo per ottenere ciò sarebbe scrivere un modello di editor personalizzato ~/Views/Shared/EditorTemplates/InvariantDouble.cshtml :

     @{ object modelValue = string.Format( System.Globalization.CultureInfo.InvariantCulture, ViewData.ModelMetadata.DisplayFormatString, ViewData.ModelMetadata.Model ); } @Html.TextBox("", modelValue, new { @class = "text-box single-line" }) 

    e poi sul tuo modello:

     [DisplayFormat(DataFormatString="{0:G}")] [UIHint("InvariantDouble")] public double Latitude; 

    e infine sulla tua vista:

     @Html.EditorFor(x => x.Latitude) 

    oppure se vuoi che tutti i duplicati della tua applicazione si comportino in questo modo usa ~/Views/Shared/EditorTemplates/Double.cshtml senza UIHint .

    Ho finito per creare un modello (Position.chtml) per una Position object secondario specifica nel mio modello in questo modo:

     @model Models.Position @{ var latitude = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0:G}", Model.Latitude); var longitude = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0:G}", Model.Longitude); } @Html.Hidden("Latitude", latitude) @Html.Hidden("Longitude", longitude) 

    In questo modo, non è necessario aggiungere alcun attributo alla class del modello.

    Mi chiedo però … è una buona pratica incluso javascript come questo? Non conosco nessun altro modo per farlo (tranne includerlo nella pagina principale, che non voglio fare perché non ne ho bisogno su tutte le pagine) senza dover ripetere me stesso. Mi piacerebbe mantenere questo ASCIUTTO …

    Inoltre (potrei fare meglio una nuova domanda per questo): come è ora, ho questo modello 2 volte, una volta come modello di editor, una volta come modello di visualizzazione. L’unica differenza è che l’ultimo parametro di attachMap deve essere true per il modello di editor e false per il modello di visualizzazione. C’è un modo semplice per rendere questo ASCIUTTO?

      public static MvcHtmlString HiddenForInvariant(this HtmlHelper htmlHelper, Expression> expression) { var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); var id = string.Format("{0}", metadata.PropertyName); var compile = expression.Compile(); string value = Convert.ToString(compile(htmlHelper.ViewData.Model), CultureInfo.InvariantCulture); var hidden = htmlHelper.Hidden(id, value).ToHtmlString(); return new MvcHtmlString(hidden); }