2011-10-03 48 views
7

我有我的模型屬性是雙重類型。其中一個項目的值爲0.000028,但當編輯視圖呈現時,此值的編輯器顯示爲2.8e-005。MVC3編輯器雙顯示科學記數法

從這個令人困惑我的用戶

除此之外,它也失敗的

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

我的正則表達式驗證我如何獲得這個領域來顯示?我有這樣的代碼(如下所示),會像我想要的那樣呈現小數,但我不確定在哪裏實現它。

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

我在兩個地方使用屬性NeckDimension,並編輯視圖和顯示視圖。這是如何呈現每個。

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

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

UPDATE 顯然,DisplayFormat不會TextBoxFor工作。我試圖將我的@ Html.TextBoxFor更改爲Html.EditorFor並給它一個類,但它失敗,出現以下異常。

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

這舊代碼仍然有效:

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

此代碼給了異常:

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

它看起來像我的選擇是使用JavaScript解決這個或編輯模板修復,但是現在我沒有時間研究和學習第二個選項。

SOLUTION:

我創建了一個模板編輯器,雙?如下。

@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使用DisplayFormat裝飾器的方法,但在我的情況下它不起作用。我不確定其他裝飾器之一是否會拋棄它,但我仍然需要一個可行的解決方案。 –

回答

7

你可以裝飾屬性上與[DisplayFormat]屬性您的視圖模型:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:F20}")] 
public double Foo { get; set; } 
在你的強類型的簡單看法

現在:

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

,或者如果它是編輯:

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

如果您想要在應用程序或按控制器中的所有雙擊中應用此格式,另一種可能性是編寫custom display/editor template

+0

我已經按照您的示例添加了DisplayFormat,但我仍然得到了科學記數法。有什麼想法嗎?我已經在所有裝飾器的問題中添加了我的屬性。 –

+0

我應該加上使用「0:F20」格式的值0.000028將返回0.00002800000000000000,這也是不可取的。這就是爲什麼我的例子中的代碼使用.TrimEnd('0')。 –

+0

@JeffReddy,我不確定我明白這個問題是什麼。如果你想在小數點後面加6個數字,爲​​什麼不用'{0:F6}'格式? –