2011-02-03 15 views
18

मैं एएसपीएनटी एमवीसी 3 का उपयोग कर रहा हूं और मुझे यह त्रुटि मिल रही है और मैं इसे समझ नहीं पा रहा हूं क्योंकि मैं टेम्पलेट का उपयोग नहीं कर रहा हूं।ऐसा करने का प्रयास करते समय एक टेम्पलेट त्रुटि प्राप्त करें?

मैं अपने viewmodel

public class FormViewModel 
    { 
     public DateTime Due { get; set; } 


     public FormViewModel() 
     { 
      DueDate = DateTime.UtcNow;   
     } 
    } 

में मेरे आंशिक दृश्य

@model ViewModels.FormViewModel 

    <div="tabs-1"> 
     @Html.TextBoxFor(x => x.Due.ToShortDateString()) 
    </div> 

में इस है और मैं इस त्रुटि

टेम्पलेट्स केवल क्षेत्र उपयोग के साथ इस्तेमाल किया जा सकता, संपत्ति प्राप्त एक्सेस, एकल-आयाम सरणी अनुक्रमणिका, या सिंगल ई-पैरामीटर कस्टम इंडेक्सर अभिव्यक्तियां। विवरण: एक अनचाहे अपवाद वर्तमान वेब अनुरोध के निष्पादन के दौरान हुआ। कृपया त्रुटि के बारे में जानकारी और के लिए कोड में उत्पन्न होने के लिए स्टैक ट्रेस की समीक्षा करें।

अपवाद विवरण: System.InvalidOperationException: टेम्पलेट्स केवल क्षेत्र का उपयोग, संपत्ति का उपयोग, एकल आयाम सरणी सूचकांक, या एकल पैरामीटर कस्टम इंडेक्सर भाव के साथ प्रयोग किया जा सकता है।

उत्तर

51

इस तरह होना चाहिए:

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] 
public DateTime Due { get; set; } 

और उसके बाद:

@Html.EditorFor(x => x.Due) 
यदि आप वास्तव में चाहते हैं के

@Html.TextBoxFor(x => x.Due) 

और आप इस तिथि के लिए कुछ प्रारूप चाहते हैं इस .ToShortDateString() विधि का उपयोग करने के लिए आपको एक गैर-दृढ़ता से टाइप करने की आवश्यकता है ped सहायक (जाहिर है कि कुछ मैं के खिलाफ की सिफारिश करेंगे है):

@Html.TextBox("Due", Model.Due.ToShortDateString()) 
+1

@ डारिन डिमिट्रोव - ठीक है मुझे लगता है कि मैंने वहां पर एक बुरा उदाहरण इस्तेमाल किया है क्योंकि इसे किसी भी स्ट्रिंग में प्रस्तुत किया जाता है। कहें कि क्या मैं "ToShortDateString()" का उपयोग करना चाहता हूं, मैं इसका उपयोग क्यों नहीं कर सकता? – chobo2

+0

@ chobo2, आप 'DisplayFormat' विशेषता' और 'Html.EditorFor' सहायक का उपयोग करके प्रारूप निर्दिष्ट कर सकते हैं। –

+0

@ डारिन डिमिट्रोव - तो मैं जो उपयोग कर रहा हूं उसे टेम्पलेट माना जाता है? तो किसी भी मददगार टेम्पलेट्स हैं और उन्हें बदलने के लिए मुझे या तो उन्हें संपादित करना होगा जैसे टॉमस लाइकेन ने कहा या देखने के लिए डेटा एनोटेशन का उपयोग करना है? – chobo2

5

क्योंकि .TextBoxFor() एचटीएमएल सहायक निर्मित एक टेम्पलेट (एक स्ट्रिंग इनपुट के लिए पाठ बॉक्स) उपयोग कर रहा है आपको त्रुटि हो रही है, और आप दे रहे हैं यह एक लैम्ब्डा अभिव्यक्ति है जो बहुत जटिल है (यानी संदेश में सूचीबद्ध प्रकारों के सेट से संबंधित नहीं है)।

समस्या को हल करने के लिए, या तो उस संपत्ति के प्रकार को बदलें जिसे आप string पर संपादित करना चाहते हैं, इसलिए एमवीसी डिफ़ॉल्ट स्ट्रिंग टेम्पलेट का उपयोग कर सकता है, या एमवीसी को इसके बजाय डिफ़ॉल्ट डेटाटाइम टेम्पलेट का उपयोग करने दें। मैं बाद की सलाह देते हैं:

@Html.TextBoxFor(m => m.Due) 

आप जिस तरह से अपने उपयोगकर्ताओं को एक तारीख को संपादित करने के लिए कहा जाता है के साथ खुश नहीं हैं, तो ~/दृश्य/साझा/EditorTemplates में नाम "DateTime.cshtml" एक आंशिक दृश्य डाल जहां आप संपादक बनाते हैं तो यह आपके इच्छित तरीके से काम करता है।

+0

@ टॉमस लाइकेन- क्या यह नया है, मुझे याद नहीं आया कि इससे पहले कि मैं रेज़र का उपयोग करना शुरू कर दूं? अगर मैंने अपना खुद का निर्माण किया तो सभी तिथियां इसे मिल जाएंगी? यहां तक ​​कि मैं भी नहीं चाहता? उदाहरण के लिए, अगर मैं केवल एक तारीख को ToShortDateString() रखना चाहता था, लेकिन बाकी सभी को सिर्फ डिफ़ॉल्ट की तरह प्रस्तुत करना है, तो यह किया जा सकता है? – chobo2

+0

@ टॉमस लाइकेन - तो मैंने जो किया वह बहुत जटिल था? क्या यह इसे पहले स्ट्रिंग में परिवर्तित नहीं करता है, फिर इसे टेक्स्टबॉक्स में रखता है? मैं इस बारे में और कहां पढ़ सकता हूं (टेक्स्टबॉक्स के लिए ये क्या हो सकता है) यह बहुत अजीब लगता है – chobo2

+0

@ chobo2: समस्या यह नहीं है कि यह * प्रस्तुत करने के लिए एक बहुत जटिल बात है * - यह सिर्फ इतना है कि हुक-अप ViewModel प्रॉपर्टी का नाम (जिसका उपयोग इनपुट फ़ील्ड के 'नाम' विशेषता के लिए किया जाएगा) आपके त्रुटि संदेश में सूचीबद्ध लोगों की तुलना में गहन कथन की अनुमति देने के बाद और अधिक जटिल हो जाता है। यदि आप अपनी तिथियों के आउटपुट को प्रभावित करना चाहते हैं, तो '[DisplayFormat]' विशेषता (या उपलब्ध अन्य विशेषताओं में से एक) का उपयोग करें, या अपना स्वयं का टेम्प्लेट बनाएं। –

5

आप MVC का उपयोग कर और एक इनलाइन कोड तत्व राशि रहे हैं, तो इस तरह एक पैरामीटर सेट करने का प्रयास -

@{ 
string parameterValue = DateTime.Parse(@item.Value).ToShortDateString(); 

} 

@Html.DisplayFor(model => parameterValue) 
+0

मुझे डेटटाइम की आवश्यकता नहीं थी। पर्स बस बस स्ट्रिंग डेटवल्यू = item.LastUpdate.ToShortDateString(); –

6

वहाँ एक अधिभार इस लक्ष्य को हासिल मदद कर सकते हैं, जबकि यह ध्यान में रखते हुए दृढ़ता से टाइप किया है।

// Specify that you're providing the format argument (string) 
@Html.TextBoxFor(x => x.Due, format: Model.Due.ToShortDateString()) 

// Or use the overload with format and html options, where null is the htmloptions 
@Html.TextBoxFor(x => x.Due, Model.Due.ToShortDateString(), null) 
0

आप textboxfor के पैरामीटर में एक विधि गुजर बजाय एक अभिव्यक्ति पास करके आवेदन को गुमराह कर रहे हैं।

आप था: एक चर में

@Html.TextBoxFor(x => x.Due.ToShortDateString()) 

स्टोर अपने परिणाम और फिर एक अभिव्यक्ति का उपयोग करें। इसके बजाय मॉडल के रूप में नीचे का प्रयोग करें @value टिप्पणियों में प्रारूप भी जोड़ने का यह

var shortDate = Model.Due.ToShortDateString(); 
@Html.TextBoxFor(x => shortDate) 
0

प्रयास करें

@ Html.TextBoxFor (x => x.Due नए {@ मान = Model.Due.ToShortDateString()})

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

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