2015-09-27 1 views
2

J'utilise MVC 5.0
Je mis la culture dans la configuration:Problème de symbole décimal dans MVC, C#?

<system.web> 
    <globalization uiCulture="fa-IR" culture="fa-IR" /> 
</system.web> 

J'ai un modèle comme suit:

public class MyModel 
{ 
    [DisplayName("NbatPersent")] 
    [Range(0, 100)] 
    public double NbatPersent{ get; set; } 
} 

MVC montre la valeur NbatPersent dans la vue comme 22/5 et quand Je veux soumettre forme le formulaire validateur m'alerte The field NbatPersent must be a number.. Il ne peut pas convertir 22/5-22.5
Il sera OK si j'entre 22,5 mais si la propriété a une valeur, il convertir . à /

Comment puis-je convertir toutes la culture de propriétés numériques en-US pour afficher la valeur comme 22.5 pas comme 22/5.

Edit:
J'utilise @Html.TextBoxFor pour montrer la propriété décimale en raison de l'utilisateur doit être changer.

+0

try this '@ Html.DisplayFor (x => x.NbatPersent, string.Format ("{0: 0.00}")); ' –

+1

Avez-vous la validation côté client activée. Si c'est le cas, ceci est le résultat de 'jquery.validation.js'. Vous pouvez utiliser 'jquery.globalize.js' pour résoudre ce problème. Et il ne sert à rien de changer '22/5' à' 22.5' parce que ça va échouer sur le serveur quand vous soumettez le formulaire sauf si vous utilisez un 'ModelBinder' personnalisé –

+0

@StephenMuecke Comment devrions-nous utiliser' jquery.globalize.js' . –

Répondre

3

vous obtenez une erreur de validation côté client en raison de jquery.validate.js qui utilise ce qui suit pour valider la valeur (qui autorise uniquement le caractère . comme séparateur décimal.

number: function(value, element) { 
    return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value); 
}, 

Vous pouvez utiliser le plug-in jquery.validate.globalize.js (voir this article pour plus de détails) ou vous pouvez ajouter votre propre script pour modifier le validateur, par exemple (inclure cette après jquery.validate.js)

$.validator.methods.number = function (value, element) { 
    return this.optional(element) || $.isNumeric($(element).val().replace('/', '.')); 
} 
+0

Note de côté: Il serait probablement préférable de remplacer' $ .isNumeric (...) bit' avec la regex correcte. Pour la dernière partie serait '(?:/\ D +)' mais je ne sais pas quel est le séparateur des milliers pour le farsi, donc je ne sais pas ce que '(?:, \ D {3}) +)' doit être (c'est-à-dire quoi utiliser au lieu de ',') –

+0

Merci, mais je reçois l'erreur 'Uncaught TypeError: Globalize.culture n'est pas une fonction ' –

+0

Utilisez-vous le plugin plutôt que le script dans la réponse? –

2

Essayez de définir le format de vue explicitement

@Html.DisplayFor(x => string.Format("{0:0.00}", x.NbatPersent)); 

que vous pouvez écrire un modèle éditeur personnalisé pour le type double (~/Vues/Shared/EditorTemplates/double.cshtml):

@model double? 
@Html.TextBox("", Model.HasValue ? Model.Value.ToString("#,##0.000#") : "") 

puis dans votre vue:

@Html.EditorFor(x => x.NbatPersent) 
+0

J'utilise '@ Html.TextBoxFor' pour montrer la propriété decimal car l'utilisateur devrait le changer. –

+0

Je pense que ce n'est pas une façon correcte, je pense que nous devrions changer la liaison MVC pour corriger ce problème dans toutes les applications sans changer les aides. N'est-ce pas? –

+0

@MohammadDayyan cela et tout dépend de vos besoins .... En utilisant l'attribut, vous pouvez le faire ...... [DisplayFormat (DataFormatString = "{0: #, ## 0.000 #}", ApplyFormatInEditMode = true)] public double? NbatPersent {get; ensemble; } –