2011-10-03 23 views
7

Ho una proprietà del mio modello che è di tipo double. Uno dei miei articoli ha un valore di 0,000028, ma quando viene visualizzata la mia vista di modifica, l'editor per questo valore viene visualizzato come 2.8e-005.MVC3 Editor For Double che mostra la notazione scientifica

A parte questo essere fonte di confusione per i miei utenti, fallisce anche il mio regolare convalida espressione di

[Display(Name = "Neck Dimension")] 
    [RegularExpression(@"[0-9]*\.?[0-9]+", ErrorMessage = "Neck Dimension must be a Number")] 
    [Range(0, 9999.99, ErrorMessage = "Value must be between 0 - 9,999.99")] 
    [Required(ErrorMessage = "The Neck Dimension is required.")] 
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:F20}")] 
    public double? NeckDimension { get; set; } 

Come faccio ad avere questo campo per visualizzare? Ho questo bit di codice (mostrato sotto) che renderà un decimale come voglio, ma non sono sicuro di dove implementarlo.

var dbltest = 0.000028D; 
Console.WriteLine(String.Format("{0:F20}", dbltest).TrimEnd('0')); 

Uso la proprietà NeckDimension in due posizioni e modifica la visualizzazione e una visualizzazione. Ecco come vengono resi ciascuno.

@Html.TextBoxFor(model => model.NeckDimension, new { style = "width:75px;" }) 

@Html.DisplayFor(model => model.NeckHDimension) 

UPDATE A quanto pare il DisplayFormat non funzionerà con TextBoxFor. Ho provato a cambiare il mio @ Html.TextBoxFor in un Html.EditorFor assegnandogli una classe, ma non è riuscito con la seguente eccezione.

The model item passed into the dictionary is of type 'System.Double', but this dictionary requires a model item of type 'System.String' 

Questo vecchio codice funziona ancora:

@Html.TextBoxFor(model => model.NeckDimension, new { style = "width:75px;" }) 

Questo codice ha dato l'eccezione:

@Html.EditorFor(model => model.NeckDimension, new {@class = "formatteddecimal"}) 

Sembra che le mie opzioni sono risolvere questo con javascript o risolvere il problema con un editor di modelli , ma non ho il tempo di studiare e imparare la seconda opzione a questo punto.

SOLUZIONE:

ho creato un editor di modelli per il doppio? come segue.

@model double? 
@{ 
    var ti = ViewData.TemplateInfo; 
    var displayValue = string.Empty; 
    if (Model.HasValue) { 
     displayValue = String.Format("{0:F20}", @Model.Value).TrimEnd('0'); 
    } 
    <input id="@ti.GetFullHtmlFieldId(string.Empty)" name="@ti.GetFullHtmlFieldName(string.Empty)" type="text" value="@displayValue" /> 
} 
+0

Mi piace l'approccio di @Darin Dimitrov sull'utilizzo del decoratore DisplayFormat, ma nel mio caso non funziona. Non sono sicuro che uno degli altri decoratori lo stia buttando via, ma ho ancora bisogno di una soluzione che funzioni. –

risposta

7

Si potrebbe decorare la proprietà del modello di visualizzazione con l'attributo [DisplayFormat]:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:F20}")] 
public double Foo { get; set; } 

e ora nel vostro punto di vista fortemente tipizzati semplicemente:

@Html.DisplayFor(x => x.Foo) 

o se è per l'editing :

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

Un'altra possibilità se si desidera applicare questo formato per tutti i doppi nell'applicazione o per controller è scrivere un custom display/editor template.

+0

Ho aggiunto il DisplayFormat come da esempio, ma sto ancora ricevendo la notazione scientifica. qualche idea? Ho aggiunto la mia proprietà alla domanda con tutti i decoratori. –

+0

Dovrei aggiungere che il valore 0,000028 utilizzando il formato "0: F20" sta per restituire 0,00002800000000000000, che non è nemmeno auspicabile. Ecco perché il mio codice nel mio esempio utilizza il .TrimEnd ('0'). –

+0

@JeffReddy, non sono sicuro di capire qual è il problema.Se vuoi 6 numeri dopo il separatore decimale, perché non usi il formato '{0: F6}'? –

Problemi correlati