2012-10-02 11 views
8

की सूची का संपादन मैं MVC में निम्नलिखित श्रेणी अभिन्यास:MVC - वस्तुओं

public class ReportModel 
{ 
    List<SomeItem> items; 
    string value; 
    string anotherValue; 
} 
अब

मैं इस प्रकार के MVC में एक जोरदार टाइप किया दृश्य बनाने और संपादन योग्य पाठ फ़ील्ड के साथ-साथ प्रत्येक मान संपादित करने के लिए बनाने के किसी भी प्रकार की सूची में आइटम को संपादित करने के लिए टेक्स्ट फ़ील्ड को पॉप्युलेट करने के लिए फ़ोरैच लूप का उपयोग करें।

जब मैं httppost विधि में सबमिट करता हूं तो सिंगलुलर मान रिपोर्टमोडल ऑब्जेक्ट में ठीक वापस आते हैं लेकिन सूची ऑब्जेक्ट में वापस नहीं आती है। यह कैसे किया जाना चाहिए?

जब मैं कहता हूँ httppost मैं विधि है कि MVC someitem की सूची

if (Model.items != null && Model.items.Count > 0) 
{ 
    for (int i = 0; i < Model.items.Count; i++) 
    {     
     <div class="editrow"> 
      <div class="edititem"> 
       <div class="editor-label"> 
        @Html.LabelFor(m => m.items.ElementAt(i).propertyOne) 
       </div> 
       <div class="editor-field"> 
        @Html.TextBoxFor(m => m.items.ElementAt(i).propertyOne) 
        @Html.ValidationMessageFor(m => m.items.ElementAt(i).propertyOne) 
       </div> 
      </div> 
      <div class="edititem"> 
       <div class="editor-label"> 
        @Html.LabelFor(m => m.items.ElementAt(i).propertyTwo) 
       </div> 
       <div class="editor-field"> 
        @Html.TextBoxFor(m => m.items.ElementAt(i).propertyTwo) 
        @Html.ValidationMessageFor(m => m.items.ElementAt(i).propertyTwo) 
       </div> 
      </div> 
      <div class="edititem"> 
       <div class="editor-label"> 
        @Html.LabelFor(m => m.items.ElementAt(i).propertyThree) 
       </div> 
       <div class="editor-field"> 
        @Html.TextBoxFor(m => m.items.ElementAt(i).propertyThree) 
        @Html.ValidationMessageFor(m => m.items.ElementAt(i).propertyThree) 
       </div> 
      </div> 
     </div> 
    } 
} 
+0

पहला: नाइटपिकिंग: शीर्षक में: सूची, जलाया नहीं गया। दूसरा: आप जिस httppost विधि के बारे में बात कर रहे हैं वह क्या है? क्या हम एंड्रॉइड से बात कर रहे हैं? कृपया उस टैग को इंगित करने के लिए जोड़ें। – bldoron

+6

क्या आपने इसे पढ़ा था: http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDories.aspx –

+0

@ किरीलबेस्टेमेनोव यह काफी नहीं है जिसे मैं ढूंढ रहा हूं क्योंकि मैं उन्हें रिपोर्ट मॉडल में वापस लाने की उम्मीद कर रहा हूं, अलग-अलग पैरामीटर के रूप में नहीं फ़ंक्शन – DMCApps

उत्तर

1

स्कॉट Hanselman ब्लॉग प्रविष्टि के किरिल के संदर्भ है पोस्ट करने के लिए

[HttpPost] 
public ActionResult EditReport(ReportModel report) 
{ 
    // Save the report in here after the update on the UI side 
} 

देखें कोड के लिए वापस पोस्ट कर रहा है की चर्चा करते हुए कर रहा हूँ सही है, लेकिन आप इसे बहुत कम पढ़ रहे हैं। दिखाए गए उदाहरण में, वह एरे को एक्शन विधि में पास करता है, लेकिन यह माता-पिता के मॉडल के साथ ही आसानी से निहित हो सकता है। वही अवधारणा लागू होती है।

हालांकि, एक बात यह जानना है कि डिफ़ॉल्ट मॉडल बाइंडर नेस्टेड कक्षाओं को तुरंत चालू नहीं करता है, इसलिए यह सूची वर्ग का एक उदाहरण नहीं बनाएगा, जिसका अर्थ है कि यह हमेशा शून्य होगा। इसे ठीक करने के लिए, आपको कन्स्ट्रक्टर में रिक्त सूची वर्ग को तुरंत चालू करना होगा।

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

यदि आप एक संपादक टेम्पलेट का उपयोग करते हैं और Html.EditorFor (m => m.Items) का उपयोग करते हैं और उसके बाद कुछ Item.cshtml EditorTemplate का उपयोग करते हैं, तो यह आम तौर पर आपके लिए संभाला जाता है। यह संग्रह आइटम नामकरण के मुद्दों से संबंधित है (जब तक आप टेम्पलेट में दृढ़ता से टाइप किए गए हेल्पर्स का भी उपयोग करते हैं)।

11

अपने लैम्ब्डा अभिव्यक्तियों में ElementAt(1) का उपयोग न करें => यह आपके इनपुट फ़ील्ड नामों को खंडित करता है। कृपया ब्लॉग पोस्ट पढ़ें कि किरील ने आपको सुझाव दिया था। क्रम में

for (int i = 0; i < Model.items.Count; i++) 
{     
    <div class="editrow"> 
     <div class="edititem"> 
      <div class="editor-label"> 
       @Html.LabelFor(m => m.items[i].propertyOne) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(m => m.items[i].propertyOne) 
       @Html.ValidationMessageFor(m => m.items[i].propertyOne) 
      </div> 
     </div> 
     <div class="edititem"> 
      <div class="editor-label"> 
       @Html.LabelFor(m => m.items[i].propertyTwo) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(m => m.items[i].propertyTwo) 
       @Html.ValidationMessageFor(m => m.items[i].propertyTwo) 
      </div> 
     </div> 
     <div class="edititem"> 
      <div class="editor-label"> 
       @Html.LabelFor(m => m.items[i].propertyThree) 
      </div> 
      <div class="editor-field"> 
       @Html.TextBoxFor(m => m.items[i].propertyThree) 
       @Html.ValidationMessageFor(m => m.items[i].propertyThree) 
      </div> 
     </div> 
    </div> 
} 
बेशक

संग्रह इस मानता है कि आपके items संपत्ति या तो List<SomeItem> या SomeItem[] के रूप में घोषित किया जाता है करने के लिए इंडेक्सर उपयोग किया है:

तो तुम अनुक्रमित पहुँच इस्तेमाल कर सकते हैं। यदि यह IEnumerable<SomeItem> है तो यह काम नहीं करेगा। तो बस अपने दृश्य मॉडल पर इस संपत्ति के प्रकार को बदलें।

+0

हम्म मुझे लगता है कि मेरा एक आईनेमरेबल है क्योंकि मैं सीधे एक दृश्य वस्तु का उपयोग कर रहा हूं और मुझे विश्वास है कि यह एक आईनेमरेबल की उम्मीद कर रहा है। असल में मुझे एक मॉडलव्यू ऑब्जेक्ट बनाना है, यह अवांछित है क्योंकि मेरे ऑब्जेक्ट में लगभग 180 फ़ील्ड हैं (इसे कम करने में कोई विकल्प नहीं है, यह मेरी परियोजना लॉल नहीं है)। – DMCApps

+2

आपके पास अपने फॉर्म पर 180 फ़ील्ड हैं और इन सभी को दृश्य से आवश्यक है? यदि ऐसा है तो दृश्य मॉडल का उपयोग करने से वास्तव में अधिक लाभ नहीं मिलेगा। तो इस मामले में आप एक कस्टम संपादक टेम्पलेट का उपयोग कर सकते हैं। दृश्य में किसी भी 'लूप' को न लिखें। बस पूरे लूप को '@ Html.EditorFor (x => x.items)' के साथ प्रतिस्थापित करें और उसके बाद 'SomeItem' क्लास - '~/Views/Shared/EditorTemplates/SomeItem.cshtml' के लिए एक कस्टम संपादक टेम्पलेट को परिभाषित करें। एएसपी.नेट एमवीसी आइटम संग्रह के प्रत्येक तत्व के लिए स्वचालित रूप से इस कस्टम टेम्पलेट का आह्वान करेगा, इसलिए टेम्पलेट को दृढ़ता से '@model someItem' –

+1

पर लिखा जाएगा, फिर कस्टम टेम्पलेट के अंदर मार्कअप को divs के साथ डालें और निम्न अभिव्यक्तियों का उपयोग करें: ' @ एचटीएमएल। टेक्स्टबॉक्स फोर (x => x.propertyOne), ... '। इस मामले में सहायक इनपुट क्षेत्रों के लिए उचित नाम उत्पन्न करेगा। –