2011-10-03 18 views
7

Mam właściwość mojego modelu, która jest typu double. Jeden z moich produktów ma wartość 0.000028, ale kiedy mój widok edycji jest renderowany, edytor dla tej wartości wyświetla się jako 2.8e-005.Edytor MVC3 dla Double pokazujący notację naukową

Poza tym jest mylące dla moich użytkowników, ale również nie moja regularna walidacja wyrazem

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

Jak mogę to pole, aby wyświetlić? Mam ten fragment kodu (pokazany poniżej), który będzie wyświetlał dziesiętny, jak chcę, ale nie jestem pewien, gdzie go zaimplementować.

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

Używam właściwości NeckDimension w dwóch miejscach i edytuję widok oraz widok wyświetlacza. Oto, jak każdy z nich jest renderowany.

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

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

UPDATE Widocznie DisplayFormat nie będzie działać z TextBoxFor. Próbowałem zmienić mój @ Html.TextBoxFor na Html.EditorFor i przyznając mu klasę, ale nie powiodło się z następującym wyjątkiem.

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

Ten stary kod nadal działa:

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

Kod ten dał wyjątek:

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

to wygląda moje opcje to naprawić z javascript lub go naprawić za pomocą edytora szablonów , ale nie mam czasu na zbadanie i poznanie drugiej opcji w tym momencie.

ROZWIĄZANIE:

stworzyłem szablon edytor podwójnie? następująco.

@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

Lubię podejście @Darina Dymitrowa do korzystania z dekoratora DisplayFormat, ale nie działa ono w moim przypadku. Nie jestem pewien, czy któryś z innych dekoratorów rzuca to, ale nadal potrzebuję rozwiązania, które działa. –

Odpowiedz

7

Można ozdobić właściwość modelu widok z atrybutem [DisplayFormat]:

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

i teraz w Twoich silnie typowanych widokiem prosto:

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

lub jeśli jest do edycji :

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

Inną możliwością, jeśli chcesz zastosować ten format dla wszystkich debów w aplikacji lub na kontroler jest napisanie custom display/editor template.

+0

Dodałem DisplayFormat jak na twój przykład, ale wciąż otrzymuję notację naukową. jakieś pomysły? Dodałem moją własność w pytaniu do wszystkich dekoratorów. –

+0

Należy dodać, że wartość 0,000028 przy użyciu formatu "0: F20" powróci 0.00002800000000000000, co również nie jest pożądane. Dlatego mój kod w moim przykładzie używa .TrimEnd ("0"). –

+0

@JeffReddy, nie jestem pewien, czy rozumiem, jaki jest problem.Jeśli chcesz 6 liczb po separatorze dziesiętnym, dlaczego nie użyjesz formatu '{0: F6}'? –