2011-09-07 8 views
5

इस पर नया नहीं है, इसलिए क्षमा करें यदि यह पर्याप्त व्याख्यात्मक नहीं है। मैं एएसपीएनटी एमवीसी 3 में एक फॉर्म में एक फ़ील्ड प्रीपॉप्लेट करना चाहता हूं। यह काम करता है;एचटीएमएल को पूर्ववत करें .extBoxFor asp.net mvc 3

@Html.TextBox("CompName", null, new { @value = ViewBag.CompName }) 

लेकिन जब मैं इसे एक मूल्य के साथ पूर्ववत करना चाहता हूं और इस मॉडल को इस मॉडल को भेजना चाहता हूं;

@Html.TextBoxFor(model => model.Comps.CompName, null, new { @value = ViewBag.CompName }) 

यह काम नहीं करेगा। कोई विचार?

अग्रिम धन्यवाद!

उत्तर

15

तो, मैं सुझाव दूंगा कि व्यूबैग के बजाय व्यूमोडल्स का उपयोग करने के लिए आगे बढ़ना है। मैंने अपनी परियोजना में एक फ़ोल्डर बनाया जिसे व्यूमोडल्स कहा जाता है और फिर वहां कुछ सबफ़ोल्डर उचित होते हैं जहां मैंने अपने विभिन्न व्यूमोडल्स लगाए।

तुम इतनी तरह एक viewmodel वर्ग बनाते हैं:

public class MyViewModel 
{ 
    public string CompName { get; set; } 
} 

फिर अपने नियंत्रक कार्रवाई में आप उन में से एक बना सकते हैं और पॉप्युलेट, कुछ मौजूदा मॉडल हो सकता है से एक डेटाबेस से खींचा जा सकता है। व्यूमोडेल में CompName संपत्ति सेट करके, यह आपके विचार में वह मान रखेगा। और फिर आपके विचार कुछ इस तरह देख सकते हैं:

@model MyNamespace.ViewModels.MyViewModel 

@Html.EditorFor(model => model.CompName) 

या @Html.TextBoxFor भी काम करेगा।

फिर पोस्ट पर अपने नियंत्रक कार्रवाई में वापस

, तो आप कुछ इस तरह है:

[HttpPost] 
public ActionResult MyAction(MyViewModel viewModel) 
{ 
    ... 
    // do whatever you want with viewModel.CompName here, like persist it back 
    // to the DB 
    ... 
} 

हो सकता है कि आप अपने मॉडल और ViewModels मैप करने के लिए automapper की तरह कुछ का उपयोग, लेकिन आप निश्चित रूप से मैन्युअल रूप से कर सकता है साथ ही, हालांकि पूरी लम्बाई/राइथेंड चीज काफी कठिन हो जाती है।

यदि आप इसे इस तरह से करते हैं और बहुत अधिक काम नहीं करते हैं तो चीजें बहुत आसान बनाती हैं।


अद्यतन

लेकिन, यदि आप वास्तव में ViewBag ध्यान में रखते हुए कि मूल्य पारित करने के लिए चाहते हैं, आप ऐसा कर सकता है:

अपने नियंत्रक कार्रवाई में:

ViewBag.CompName = "Some Name"; 

फिर आपके विचार में:

@Html.TextBoxFor(model =>model.Comps.CompName, new {@Value = ViewBag.CompName}) 

और वह "कुछ नाम" के साथ टेक्स्टबॉक्स को पूर्व-पॉप्युलेट करेगा।

मैं अभी भी व्यूमोडेल दृष्टिकोण के साथ जाऊंगा, लेकिन ऐसा लगता है कि यह काफी अच्छा काम करता है। उम्मीद है की वो मदद करदे!

+0

आपके उत्तर के लिए धन्यवाद।व्यूबैग मेरी गेट-एंटर प्रतियोगिता कार्रवाई में है और मेरा 'प्रतियोगिता' मॉडल से नाम लेता है (एक प्रतिस्पर्धा एंटर्री मॉडल भी है (ऐसा इसलिए है कि मैं प्रवेश फॉर्म के शीर्ष पर प्रतिस्पर्धा का नाम प्रदर्शित कर सकता हूं। मेरी प्रतिस्पर्धा प्रविष्टि में मॉडल में मेरे पास एक नेविगेशन प्रॉपर्टी 'पब्लिक वर्चुअल कॉम्पिटिशन कॉम्पिटिशन' है। मैंने सोचा कि प्रतिस्पर्धा एंट्री.कॉमपनाम टेक्स्टबॉक्स को प्रीब-पॉपलेट करने के लिए एक आसान ऐय होगा, जो व्यूबैग में है। मैं इस चरण में अपने मॉडल को बदलना नहीं चाहता ईमानदार होने के लिए, क्या आप इसे देखने में एक तरीका जानते हैं? धन्यवाद। – Dan

+0

दान, मेरे उत्तर के अंत में मेरा अपडेट देखें। मेरी टेस्ट प्रोजेक्ट में काफी अच्छा काम करने लगता है। – itsmatt

+0

मुझे नहीं मिलेगा इसे एक घंटे या उससे भी अधिक समय तक प्रयास करें, जब मैं करता हूं तो मैं वापस लिखूंगा। मैट की मदद करने के लिए धन्यवाद! – Dan

3

अपने नियंत्रक से, यदि आप मॉडल ऑब्जेक्ट को स्वीकार करने वाले View(...) विधि ओवरलोड का उपयोग करके डिफ़ॉल्ट मानों के साथ प्रारंभ किए गए मॉडल को पास करते हैं, तो इन मानों को प्रस्तुत किए जाने पर दृश्य द्वारा उपयोग किया जाएगा। आपको @value = ... वाक्यविन्यास का उपयोग करने की आवश्यकता नहीं होगी।

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