2011-10-03 11 views
7

Benim modelimin bir özelliği çift tipi olan bir özelliği var. Öğelerimden biri 0.000028 değerine sahiptir, ancak düzenleme görünümüm oluşturulduğunda, bu değerin düzenleyicisi 2,8e-005 olarak gösterilir. Benim kullanıcılara kafa karıştırıcı olmaktan bundan KenaraMVC3 Editör Çift gösterme bilimsel gösterim için

, aynı zamanda

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

benim düzenli ifade doğrulama nasıl bu alan görüntülemek için alabilirim başarısız? İstediğim gibi bir ondalık oluşturacak olan bu kodu (aşağıda gösterildi) aldım, ama nerede uygulayacağımı bilmiyorum.

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

NeckDimension özelliğini iki yerde kullanıyorum ve görünümü ve görünüm görünümünü düzenlerim. İşte her biri nasıl işleniyor.

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

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

GÜNCELLEME Görünüşe DisplayFormat TextBoxFor ile çalışmaz. @ Html.TextBoxFor'umu bir Html.EditorFor'a değiştirmeyi ve bir sınıf vermeyi denedim ancak aşağıdaki istisnada başarısız oldu.

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

Bu eski kod hala çalışır:

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

Benim seçenekleri javascript ile bu düzeltmek veya bir editör şablonu ile düzeltmek vardır benziyor:

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

Bu kod istisna verdi ama bu noktada 2. seçeneği araştırmak ve öğrenmek için zamanım yok.

ÇÖZÜM:

Çift için bir editör şablonu yarattı? aşağıdaki gibi.

@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

@Darin Dimitrov'un DisplayFormat dekoratörünü kullanma yaklaşımını beğeniyorum, fakat benim durumumda çalışmıyor. Diğer dekoratörlerden birinin bunu atıp atmadığından emin değilim, ama hala işe yarayan bir çözüme ihtiyacım var. –

cevap

7

Sen [DisplayFormat] özniteliği ile görüşünüz modeline özelliği süslemeleri: basitçe kesinlikle yazılı görüşlerinde

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

ve şimdi:

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

veya düzenleme için ise :

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

Bu biçimi uygulamanızdaki veya denetleyicinizdeki tüm çiftler için uygulamak istediğinizde bir başka olasılık da custom display/editor template yazmaktır.

+0

DisplayFormat'ı örneğinize göre ekledim, ancak hala bilimsel gösterimi alıyorum. Düşüncesi olan var mı? Tüm dekoratörlerle mülkümü sordum. –

+0

"0: F20" biçimini kullanarak 0.000028 değerinin 0.0000280000000000000000 değerini döndüreceğini de eklemeliyim ki bu da istenmiyor. Bu yüzden benim örneğimde kodum .TrimEnd ('0') kullanıyor. –

+0

@JeffReddy, sorunun ne olduğunu anladığımdan emin değilim.Ondalık ayırıcıdan sonra 6 rakam istiyorsanız, neden "{0: F6}" biçimini kullanmıyorsunuz? –