2010-09-14 15 views
8

के माध्यम से पुनरावृत्ति दृढ़ता से टाइप किया सहायकों उपयोग करने के लिए मैं एक आंशिक मानना ​​है कि एक मेज प्रारूप में वस्तुओं की एक सूची प्रदान और मूल्यों के संपादन की अनुमति देता है ...mvc.net कैसे जबकि सूची

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<whoozit.Models.PictureModel>>" %> 

<% foreach (whoozit.Models.PictureModel p in Model) 
      { %> 

    <td> 
    <%: Html.TextBox("name",p.name) %> 
    <%: Html.ValidationMessage(p.name) %> 
    </td> 

<% } %> 

मैं एमवीसी 2 में दृढ़ता से टाइप किए गए एचटीएमएल सहायकों का लाभ उठाने के लिए इसे पुन: प्रतिक्रिया देना चाहते हैं। मैं लैम्ब्डा अभिव्यक्तियों को बनाने के तरीके को समझने में कठिनाई में भाग रहा हूं और कुछ मदद की उम्मीद कर रहा था। निम्नलिखित मेरे लिए काफी सही प्रतीत नहीं होता है।

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<whoozit.Models.PictureModel>>" %> 

<% foreach (whoozit.Models.PictureModel p in Model) 
      { %> 

    <td> 
    <%: Html.TextBoxFor(???) %> 
    </td> 

<% } %> 

उत्तर

8

सबसे पहले आप एक दृश्य में पुनरावृत्ति नहीं होनी चाहिए। इटरेटिंग का मतलब है लूप, लूप का मतलब है सी #/वीबी.नेट, सी #/वीबी.नेट एक दृश्य में स्पेगेटी कोड की ओर जाता है।

मैं आपको Editor Templates का उपयोग करने की सलाह दूंगा। इस तरह आपको अपने विचारों में लूप लिखने की आवश्यकता नहीं है। ~/Views/Home/EditorTemplates/PictureModel.ascx में निम्न फ़ाइल जोड़ें:

<%@ Control Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<whoozit.Models.PictureModel>" %> 
<td> 
    <%: Html.TextBoxFor(x => x.name) %> 
    <%: Html.ValidationMessageFor(x => x.name) %> 
</td> 

सूचना है कि आंशिक अब दृढ़ता से whoozit.Models.PictureModel बजाय IList<whoozit.Models.PictureModel> को लिखा गया। अब वह सब छोड़ दिया है इस मुख्य दृश्य से आंशिक शामिल करने के लिए है:

<%: Html.EditorFor(x => x.Pictures) %> 

कहाँ Pictures अपने मुख्य दृश्य मॉडल पर प्रकार IList<whoozit.Models.PictureModel> की संपत्ति है। यह स्वचालित रूप से संग्रह के प्रत्येक तत्व के लिए आंशिक रूप से आविष्कार करेगा ताकि आपको अपने विचारों में बदसूरत लूप लिखने की आवश्यकता न हो।

यह सिर्फ सम्मेलन द्वारा काम करता है: आंशिक आवश्यकताओं को सूची तत्वों के प्रकार के नाम के रूप में PictureModel.ascx कहा जाना चाहिए और ~/Views/Home/EditorTemplates या ~/Views/Shared/EditorTemplates फ़ोल्डर में स्थित होना चाहिए।

संपादक/प्रदर्शन टेम्पलेट्स आपके विचार अधिक सुंदर बना देंगे।

टिप्पणी: .NET में सम्मेलन पूंजी पत्र से शुरू होने के लिए संपत्ति नाम है, इसलिए मैं आपको name संपत्ति को Name पर नाम बदलने की अनुशंसा करता हूं।

<%: Html.TextBoxFor(x => x.Name) %> 
1
<%= Html.TextBoxFor(p => p.name) %> 
+0

इस 'IList की एक त्रुटि देता है नाम की एक परिभाषा शामिल नहीं है ...'वेरिएबल' पी 'प्रकार की सूची है और चित्र की नहीं है, इसलिए मैं नाम फ़ील्ड तक नहीं पहुंच सकता – yamspog

1

आप whoozit.Models.PictureModel मदों की एक सूची की उम्मीद करने के लिए अपने आंशिक दृश्य कह रहे हैं। तब आपका foreach whoozit के लिए देख रहा है। मॉडल। चित्र पिक्चर मॉडल नहीं। नीचे मैं सामान्य रूप से ऐसा कुछ कैसे करूंगा। सुनिश्चित करें कि आपकी सूची का आकलन करने का प्रयास सही प्रकार है। अगर पिक्चर क्लास पिक्चरमोडेल के अंदर एक संग्रह से आ रहा है तो सुनिश्चित करें कि आप मॉडल कर रहे हैं। जो भी foreach में।

इस प्रयास करें:

सभी की
<% foreach(var p in Model) { %> 
<td> 
<%: Html.TextBoxFor(p => p.name) %> 
<%: Html.ValidateFor(p => p.name) %> 
</td> 
<% } %> 
2

आप पाश के लिए एक साथ मॉडल के माध्यम से पाशन द्वारा प्रबलता से टाइप किये सहायक तरीकों का उपयोग कर सकते हैं: यह सिर्फ लिखने और पढ़ने के लिए और अधिक प्राकृतिक महसूस करता है। यह "नाम" एचटीएमएल विशेषता अद्वितीय भी बना देगा ताकि मॉडल बाइंडर आपको सहेजने की स्थिति में मूल्यों को अपने मॉडल पर वापस मैप करने में मदद कर सके।

<% for (int i = 0; i < Model.Count; i++) { %> 

    <%: Html.TextBoxFor(m => m[i].Name) %> 
    <%: Html.TextBoxFor(m => m[i].SomethingElse) %> 

<% } %> 

और पढ़ें यहाँ .. http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx