7
votes

Comment rendre certains champs de modèle spécifiques avec une invariante, tandis que le reste continue d'utiliser la culture des utilisateurs?

J'ai quelques entrées cachées sur une vue ASP.NET MVC. Leurs valeurs contiennent des objets de type double . Je veux qu'ils soient rendus avec le invariantCulture car ils sont utilisés pour être nourris à une API (Google Maps) sur le client. Comme il est maintenant, ils sont rendus avec une virgule (,) comme séparateur décimal, tandis que l'API attend un point (.) Comme séparateur décimal.

La solution la plus belle serait si je pouvais spécifier une culture dans le DisplayFormat Attribut d'annotation de données sur la propriété sur le modèle, mais je ne pense pas que ce soit possible: xxx

Je ne peux pas aussi simplement définir le CurrentCulture à invariantCulture dans mon Application_start , car il existe d'autres valeurs sur l'écran qui doivent être dans la culture d'utilisateur appropriée.

Ainsi, est-il un moyen de changer temporairement la culture actuelle, juste avant de faire un html.hiddacfor (modèle => modèle.latitude) pour cette propriété spécifique, et Puis réinitialisez-le ensuite?

ou y a-t-il une autre meilleure façon de faire cela? Ce qui est considéré comme la meilleure pratique concernant cela?


0 commentaires

3 Réponses :


4
votes

Un moyen d'atteindre cela serait d'écrire un modèle d'éditeur personnalisé ~ / vues / partagé / editorTorplates / invariartdouble.cshtml : xxx

puis sur votre Modèle: xxx

et enfin à votre vue: xxx

ou si vous vouliez que tous les doubles dans votre application soient comportant Ceci utilise les ~ / vues / shared / editortempleates / double.cshtml sans aucun uihint .


3 commentaires

Merci, mais si j'ai aussi un [Hiddeninput (displayvalue = false)] attribut sur la propriété?


@fretje, puis remplacer hiddeninput.cshtml . Brad Wilson couvre les modèles par défaut de ce blog post: bradwilson.typepad.com/blog/2009/10/...


Je l'ai fait un peu différent ... voir Ma réponse .



1
votes

J'ai fini par créer un modèle (position.chtml) pour un sous-objet spécifique Position code> dans mon modèle comme celui-ci:

@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) 
<p /> 
<div id="mapCanvas"></div>

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
<script type="text/javascript" src="@Url.Content("~/Scripts/maps.js")"></script>
<script type="text/javascript">
    $(function () {
        attachMap($('#mapCanvas'), $('#Position_Latitude'), $('#Position_Longitude'), true);
    }) 
</script>


1 commentaires

Vieux post mais je vais mettre mes deux cents quand même ... Tout d'abord vos scripts ~ / scripts / map.js et le script Google Maps seront inclus chaque fois que cette vue partielle sera rendue. Pourrait être mauvais si vous montrez plus d'une carte dans une vue donnée. De plus, si vous avez plus d'une carte, vous pouvez personnaliser le MapCanvas ID, il est donc unique dans la page. Troisièmement, vous pouvez utiliser une autre vue partielle appelée par Modèle Editeur et Affichage et recevoir des informations sur les paramètres Boolean Boolean.



0
votes
    public static MvcHtmlString HiddenForInvariant<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> 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);
    }

0 commentaires