2011-10-03 15 views
7

मुझे अपने मॉडल की एक संपत्ति मिली है जो कि डबल टाइप है। मेरे आइटमों में से एक का मूल्य 0.000028 है, लेकिन जब मेरा संपादन दृश्य प्रस्तुत किया जाता है, तो इस मान के संपादक 2.8e-005 के रूप में दिखाए जाते हैं।एमवीसी 3 संपादक डबल नोटिंग वैज्ञानिक नोटेशन

यह मेरा उपयोगकर्ताओं के लिए भ्रामक होने से

एक तरफ, यह भी विफल रहता है

[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')); 

मैं दो स्थानों पर संपत्ति नेकडिमेन्शन का उपयोग करता हूं, और दृश्य और प्रदर्शन दृश्य संपादित करता हूं। यहां बताया गया है कि प्रत्येक को कैसे प्रस्तुत किया जा रहा है।

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

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

अद्यतन जाहिर DisplayFormat TextBoxFor साथ काम नहीं करेंगे। मैंने अपने @ Html.TextBox को एक 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.EditorFor(model => model.NeckDimension, new {@class = "formatteddecimal"}) 

ऐसा लगता है कि मेरे विकल्प जावास्क्रिप्ट के साथ इस को ठीक करने या एक संपादक टेम्पलेट के साथ इसे ठीक कर रहे हैं:

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

इस कोड को अपवाद दिया , लेकिन मेरे पास इस समय दूसरे विकल्प को खोजने और सीखने का समय नहीं है।

समाधान:

मैं डबल के लिए एक संपादक खाका बनाया? निम्नलिखित नुसार।

@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

मुझे डिस्प्लेफॉर्मेट सजावट का उपयोग करने के लिए @ डारिन डिमिट्रोव के दृष्टिकोण पसंद हैं, लेकिन यह मेरे मामले में काम नहीं करता है। मुझे यकीन नहीं है कि अगर अन्य सजावट में से एक इसे फेंक रहा है, लेकिन मुझे अभी भी एक समाधान की आवश्यकता है जो काम करता है। –

उत्तर

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: एफ 20" के प्रारूप का उपयोग करके 0.000028 मूल्य 0.00002800000000000000 लौटने जा रहा है, जो कि वांछनीय नहीं है। यही कारण है कि मेरे उदाहरण में मेरा कोड .TrimEnd ('0') का उपयोग करता है। –

+0

@ जेफ रेड्डी, मुझे यकीन नहीं है कि मैं समझता हूं कि समस्या क्या है।यदि आप दशमलव विभाजक के बाद 6 नंबर चाहते हैं तो आप '{0: F6} 'प्रारूप का उपयोग क्यों नहीं करते? –

संबंधित मुद्दे