एमवीसी रेज़र ने नेचुरल फॉर्च्यूनर के मॉडल को देखा


94

एक सामान्य परिदृश्य की कल्पना करें, यह एक सरल संस्करण है जो मैं भर में आ रहा हूं। मेरे पास वास्तव में आगे घोंसले की परतों की एक जोड़ी है ...।

लेकिन यह परिदृश्य है

थीम में सूची श्रेणी होती है, सूची उत्पाद में सूची होती है

मेरा नियंत्रक पूरी तरह से आबादी वाला थीम प्रदान करता है, उस विषय के लिए सभी श्रेणियां, इस श्रेणियों के भीतर उत्पाद और उनके आदेश।

आदेश संग्रह में एक संपत्ति होती है जिसे क्वांटिटी (कई अन्य के बीच) कहा जाता है जिसे संपादन योग्य होना चाहिए।

@model ViewModels.MyViewModels.Theme

@Html.LabelFor(Model.Theme.name)
@foreach (var category in Model.Theme)
{
   @Html.LabelFor(category.name)
   @foreach(var product in theme.Products)
   {
      @Html.LabelFor(product.name)
      @foreach(var order in product.Orders)
      {
          @Html.TextBoxFor(order.Quantity)
          @Html.TextAreaFor(order.Note)
          @Html.EditorFor(order.DateRequestedDeliveryFor)
      }
   }
}

अगर मैं इसके बजाय लैम्ब्डा का उपयोग करता हूं, तो मुझे केवल शीर्ष मॉडल ऑब्जेक्ट, "थीम" का संदर्भ मिलता है, न कि फॉरेस्ट लूप के भीतर।

क्या मैं वहां भी संभव करने की कोशिश कर रहा हूं या क्या मैंने गलत समझा है या गलत समझा है कि क्या संभव है?

उपरोक्त के साथ मुझे TextboxFor, EditorFor, आदि पर एक त्रुटि मिलती है

CS0411: विधि 'System.Web.Mvc.Html.InputExtensions.TextBoxFor (System.Web.Mvc.HtmlHelper, System.Linq.Expressions.Expression'> ') के प्रकार के तर्क उपयोग से अनुमान नहीं लगाए जा सकते हैं। प्रकार तर्क स्पष्ट रूप से निर्दिष्ट करने का प्रयास करें।

धन्यवाद।


1
क्या आपके पास @सब से पहले नहीं होना चाहिए foreach? क्या आपको Html.EditorFor( Html.EditorFor(m => m.Note)उदाहरण के लिए) और बाकी तरीकों में भी लंबोदा नहीं होना चाहिए ? मैं गलत हो सकता हूं, लेकिन क्या आप अपना वास्तविक कोड पेस्ट कर सकते हैं? मैं एमवीसी के लिए बहुत नया हूं, लेकिन आप इसे आंशिक विचारों, या संपादकों (यदि यह नाम है) के साथ आसानी से हल कर सकते हैं।
कोबी

category.nameमुझे यकीन है कि यह एक है stringऔर ...Forपहले पैरामीटर के रूप में एक स्ट्रिंग का समर्थन नहीं करता है
balexandre

हाँ, मैं अभी @ को याद कर रहा हूं, अब जोड़ा गया। धन्यवाद। हालाँकि, लैंबडा के लिए, अगर मैं @ Html.TextBoxFor (m => m) टाइप करना शुरू करता हूं, तो मुझे केवल शीर्ष मॉडल ऑब्जेक्ट का संदर्भ मिलता है, न कि उन लोगों के बारे में जो फ़ॉरच लूप के भीतर हैं।
डेविड सी

@DavidC - मुझे अभी तक जवाब देने के लिए MVC 3 का पर्याप्त पता नहीं है - लेकिन मुझे संदेह है कि आपकी समस्या है :)
कोबी

2
मैं ट्रेन पर हूँ, लेकिन अगर इसका उत्तर मुझे काम करने के लिए नहीं मिलता है, तो मैं एक उत्तर पोस्ट को बीमार कर सकता हूँ। त्वरित उत्तर एक के for()बजाय एक नियमित रूप से उपयोग करना है foreach। मैं समझाता हूँ क्यों, क्योंकि यह मेरे लिए बहुत समय के लिए नरक को भ्रमित करता है।
जे। होम्स

जवाबों:


304

त्वरित उत्तर for()आपके foreach()छोरों के स्थान पर एक लूप का उपयोग करना है। कुछ इस तरह:

@for(var themeIndex = 0; themeIndex < Model.Theme.Count(); themeIndex++)
{
   @Html.LabelFor(model => model.Theme[themeIndex])

   @for(var productIndex=0; productIndex < Model.Theme[themeIndex].Products.Count(); productIndex++)
   {
      @Html.LabelFor(model=>model.Theme[themeIndex].Products[productIndex].name)
      @for(var orderIndex=0; orderIndex < Model.Theme[themeIndex].Products[productIndex].Orders; orderIndex++)
      {
          @Html.TextBoxFor(model => model.Theme[themeIndex].Products[productIndex].Orders[orderIndex].Quantity)
          @Html.TextAreaFor(model => model.Theme[themeIndex].Products[productIndex].Orders[orderIndex].Note)
          @Html.EditorFor(model => model.Theme[themeIndex].Products[productIndex].Orders[orderIndex].DateRequestedDeliveryFor)
      }
   }
}

लेकिन यह इस समस्या को ठीक क्यों करता है, इस पर ग्लॉज़ होता है।

तीन चीजें हैं जो आपके पास कम से कम एक सरसरी समझ है इससे पहले कि आप इस मुद्दे को हल कर सकें। मुझे यह स्वीकार करना होगा कि मैंने लंबे समय तक कार्गो की खेती की जब मैंने फ्रेमवर्क के साथ काम करना शुरू किया। और मुझे वास्तव में जो कुछ हो रहा था उसे पाने में काफी समय लगा।

वे तीन चीजें हैं:

  • MVC में LabelForअन्य ...Forसहायक कैसे काम करते हैं?
  • एक्सप्रेशन ट्री क्या है?
  • मॉडल बाइंडर कैसे काम करता है?

इन तीनों अवधारणाओं का उत्तर पाने के लिए एक साथ लिंक करें।

MVC में LabelForअन्य ...Forसहायक कैसे काम करते हैं?

इसलिए, जब आप का उपयोग किया है HtmlHelper<T>के लिए एक्सटेंशन LabelForऔर TextBoxForऔर अन्य लोगों, और आप शायद गौर किया है कि जब आप उन्हें आह्वान, तो आप उन्हें एक लैम्ब्डा गुजरती हैं और यह जादुई कुछ html उत्पन्न करता है। पर कैसे?

तो पहली बात नोटिस इन सहायकों के लिए हस्ताक्षर है। के लिए सबसे सरल अधिभार को देखने की सुविधा देता है TextBoxFor

public static MvcHtmlString TextBoxFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper,
    Expression<Func<TModel, TProperty>> expression
) 

सबसे पहले, यह एक HtmlHelperप्रकार का जोरदार टाइप के लिए एक विस्तार विधि है <TModel>। इसलिए, केवल यह बताने के लिए कि पर्दे के पीछे क्या होता है, जब रेजर इस दृश्य को प्रस्तुत करता है तो यह एक वर्ग उत्पन्न करता है। इस वर्ग के अंदर एक उदाहरण है HtmlHelper<TModel>(संपत्ति के रूप में Html, जिसके कारण आप इसका उपयोग कर सकते हैं @Html...), TModelआपके @modelकथन में परिभाषित प्रकार कहां है । तो आपके मामले में, जब आप इस दृश्य TModel को देख रहे हैं तो यह हमेशा प्रकार का होगा ViewModels.MyViewModels.Theme

अब, अगला तर्क थोड़ा मुश्किल है। तो चलो एक आह्वान को देखो

@Html.TextBoxFor(model=>model.SomeProperty);

ऐसा लगता है कि हमारे पास थोड़ा सा लंबोदा है, और अगर किसी को हस्ताक्षर का अनुमान लगाना था, तो कोई सोच सकता है कि इस तर्क के लिए प्रकार केवल एक होगा Func<TModel, TProperty>, जहां TModelदृश्य मॉडल TProperty का प्रकार है और संपत्ति के प्रकार के रूप में अनुमान लगाया गया है।

लेकिन यह बिल्कुल सही नहीं है, अगर आप तर्क के वास्तविक प्रकार को देखें Expression<Func<TModel, TProperty>>

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

हालांकि, जब कंपाइलर देखता है कि प्रकार एक है Expression<>, तो यह तुरंत लैम्बडा को एमएसआईएल के लिए संकलित नहीं करता है, इसके बजाय यह एक अभिव्यक्ति ट्री उत्पन्न करता है!

एक्सप्रेशन ट्री क्या है ?

तो, क्या बिल्ली एक अभिव्यक्ति पेड़ है। ठीक है, यह जटिल नहीं है, लेकिन पार्क में चलना भी नहीं है। एमएस को उद्धृत करने के लिए:

| अभिव्यक्ति के पेड़ एक पेड़ की तरह डेटा संरचना में कोड का प्रतिनिधित्व करते हैं, जहां प्रत्येक नोड एक अभिव्यक्ति है, उदाहरण के लिए, एक विधि कॉल या बाइनरी ऑपरेशन जैसे x <y।

सीधे शब्दों में कहें, एक अभिव्यक्ति पेड़ "कार्यों" के संग्रह के रूप में एक समारोह का प्रतिनिधित्व है।

के मामले में model=>model.SomeProperty, अभिव्यक्ति के पेड़ में एक नोड होता है जो कहता है: "एक मॉडल से" कुछ संपत्ति प्राप्त करें "

इस अभिव्यक्ति के पेड़ को एक फ़ंक्शन में संकलित किया जा सकता है, लेकिन जब तक यह एक अभिव्यक्ति पेड़ है, तब तक यह सिर्फ नोड्स का संग्रह है।

तो इसके लिए क्या अच्छा है?

तो Func<>या Action<>, एक बार जब आप उन्हें है, वे बहुत ज्यादा परमाणु हैं। आप वास्तव में Invoke()उन्हें कर सकते हैं, उर्फ ​​उन्हें वह काम करने को कहें जो वे करने वाले हैं।

Expression<Func<>>दूसरी ओर, क्रियाओं के एक संग्रह का प्रतिनिधित्व करता है, जिसे जोड़ा जा सकता है, हेरफेर किया जा सकता है, दौरा किया जा सकता है , या संकलित और लागू किया जा सकता है।

तो आप मुझे यह सब क्यों बता रहे हैं?

तो क्या है की समझ के साथ Expression<>, हम वापस जा सकते हैं Html.TextBoxFor। जब यह एक टेक्स्टबॉक्स प्रस्तुत करता है, तो आपको उस संपत्ति के बारे में कुछ चीजें उत्पन्न करने की आवश्यकता होती है जो आप दे रहे हैं। attributesसत्यापन के लिए संपत्ति पर चीजें पसंद हैं, और विशेष रूप से इस मामले में यह पता लगाने की आवश्यकता है कि टैग का नाम क्या है <input>

यह अभिव्यक्ति पेड़ का "चलना" और एक नाम का निर्माण करता है। तो जैसे एक अभिव्यक्ति के लिए model=>model.SomeProperty, यह उस गुण को इकट्ठा करता है जो आप के लिए पूछ रहे हैं और बनाता है <input name='SomeProperty'>

अधिक जटिल उदाहरण के लिए, जैसे model=>model.Foo.Bar.Baz.FooBar, यह उत्पन्न हो सकता है<input name="Foo.Bar.Baz.FooBar" value="[whatever FooBar is]" />

सही बात? यह केवल वह कार्य नहीं है जो Func<>करता है, लेकिन यह अपना कार्य कैसे करता है यह यहां महत्वपूर्ण है।

(ध्यान दें कि LINQ से SQL जैसी अन्य चौखटें एक अभिव्यक्ति पेड़ पर चलने और एक अलग व्याकरण का निर्माण करके इसी तरह की चीजें करती हैं, ताकि यह SQL क्वेरी हो)

मॉडल बाइंडर कैसे काम करता है?

तो एक बार जब आप ऐसा कर लेते हैं, तो हमें मॉडल बाइंडर के बारे में संक्षेप में बात करनी होगी। जब फॉर्म पोस्ट हो जाता है, तो यह एक फ्लैट की तरह होता है Dictionary<string, string>, हमने अपने नेस्टेड व्यू मॉडल को पदानुक्रमित संरचना खो दिया है। यह इस महत्वपूर्ण-मूल्य जोड़ी कॉम्बो को लेने के लिए मॉडल बाइंडर का काम है और कुछ गुणों के साथ किसी ऑब्जेक्ट को फिर से व्यवस्थित करने का प्रयास करता है। यह ऐसे कैसे करता है? आपने अनुमान लगाया, "कुंजी" या इनपुट के नाम का उपयोग करके जो पोस्ट किया गया है।

तो अगर फॉर्म पोस्ट दिखता है

Foo.Bar.Baz.FooBar = Hello

और आप नामक एक मॉडल को पोस्ट कर रहे हैं SomeViewModel, फिर यह रिवर्स करता है कि सहायक ने पहले स्थान पर क्या किया था। यह "फू" नामक एक संपत्ति की तलाश करता है। फिर यह "फू" से "बार" नामक एक संपत्ति की तलाश करता है, फिर यह "बाज" के लिए दिखता है ... और इसी तरह ...

अंत में यह "फूबर" के प्रकार में मूल्य को पार्स करने की कोशिश करता है और इसे "फूबर" को सौंपता है।

ओफ़्फ़ !!!

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


इसलिए आपका समाधान काम नहीं करता है क्योंकि Html.[Type]For()सहायकों को एक अभिव्यक्ति की आवश्यकता होती है। और आप उन्हें सिर्फ एक मूल्य दे रहे हैं। यह पता नहीं है कि उस मूल्य के लिए संदर्भ क्या है, और यह नहीं जानता कि इसके साथ क्या करना है।

अब कुछ लोगों ने रेंडर करने के लिए partials का उपयोग करने का सुझाव दिया। अब यह सिद्धांत रूप में काम करेगा, लेकिन शायद वह तरीका नहीं है जिसकी आप अपेक्षा करते हैं। जब आप एक आंशिक रेंडर करते हैं, तो आप का प्रकार बदल रहे हैं TModel, क्योंकि आप एक अलग दृश्य संदर्भ में हैं। इसका मतलब है कि आप अपनी संपत्ति का वर्णन कम अभिव्यक्ति के साथ कर सकते हैं। इसका अर्थ यह भी है कि जब सहायक आपकी अभिव्यक्ति के लिए नाम बनाता है, तो यह उथला होगा। यह केवल उसके द्वारा दी गई अभिव्यक्ति (संपूर्ण संदर्भ नहीं) के आधार पर उत्पन्न होगा।

तो चलिए आपको बताते हैं कि आपने "बाज" (पहले हमारे उदाहरण से) प्रदान किया था। उस आंशिक के अंदर आप बस कह सकते हैं:

@Html.TextBoxFor(model=>model.FooBar)

बजाय

@Html.TextBoxFor(model=>model.Foo.Bar.Baz.FooBar)

इसका मतलब है कि यह इस तरह एक इनपुट टैग उत्पन्न करेगा:

<input name="FooBar" />

जो, यदि आप इस फॉर्म को एक ऐसे एक्शन में पोस्ट कर रहे हैं, जो एक बड़े नेस्टेड व्यूमॉडल की उम्मीद कर रहा है, तो यह एक प्रॉपर्टी को FooBarऑफ- हाइड करने की कोशिश करेगा TModel। जो सबसे अच्छा नहीं है, और सबसे बुरी तरह से पूरी तरह से कुछ और है। यदि आप एक विशिष्ट क्रिया को पोस्ट कर रहे थे Bazजो रूट मॉडल के बजाय एक को स्वीकार कर रहा था , तो यह बहुत अच्छा काम करेगा! वास्तव में, आपके विचार के संदर्भ को बदलने के लिए पार्टिकल्स एक अच्छा तरीका है, उदाहरण के लिए यदि आपके पास कई रूपों के साथ एक पृष्ठ है जो सभी विभिन्न कार्यों के लिए पोस्ट करते हैं, तो प्रत्येक के लिए एक आंशिक प्रतिपादन एक महान विचार होगा।


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


4
बहुत बढ़िया जवाब। मैं वर्तमान में इसे पचाने की कोशिश कर रहा हूं। :) इसके अलावा कार्गो कल्टिंग के दोषी! उस विवरण की तरह।
डेविड सी

4
इस विस्तृत उत्तर के लिए धन्यवाद!
कोबी

14
इसके लिए एक से अधिक उत्थान चाहिए। +3 (प्रत्येक स्पष्टीकरण के लिए एक), और कार्गो-कल्टिस्ट के लिए +1। बिल्कुल शानदार जवाब!
Kyeotic

3
यही कारण है कि मुझे SO से प्यार है: संक्षिप्त उत्तर + में गहराई से स्पष्टीकरण + भयानक लिंक (कार्गो-पंथ)। मैं कार्गो-पंथ के बारे में पोस्ट किसी को भी दिखाना चाहूंगा जो यह नहीं सोचता कि सामान के आंतरिक कामकाज के बारे में ज्ञान बेहद महत्वपूर्ण है!
user1068352

18

आप बस EditorTemplates का उपयोग कर सकते हैं ऐसा करने के लिए, आपको अपने नियंत्रक के दृश्य फ़ोल्डर में "EditorTemplates" नामक एक निर्देशिका बनाने की आवश्यकता है और अपने प्रत्येक नेस्टेड संस्थाओं के लिए एक अलग दृश्य रखें (जिसे इकाई वर्ग नाम दिया गया है)

प्रमुख राय :

@model ViewModels.MyViewModels.Theme

@Html.LabelFor(Model.Theme.name)
@Html.EditorFor(Model.Theme.Categories)

श्रेणी दृश्य (/MyController/EditorTemplates/Category.cshtml):

@model ViewModels.MyViewModels.Category

@Html.LabelFor(Model.Name)
@Html.EditorFor(Model.Products)

उत्पाद दृश्य (/MyController/EditorTemplates/Product.cshtml):

@model ViewModels.MyViewModels.Product

@Html.LabelFor(Model.Name)
@Html.EditorFor(Model.Orders)

और इसी तरह

इस तरह Html.EditorFor हेल्पर एलिमेंट तरीके से एलिमेंट के नाम जेनरेट करेगा और इसलिए आपको पोस्ट की गई थीम यूनिट को पूरी तरह से प्राप्त करने के लिए कोई और समस्या नहीं होगी।


1
जबकि स्वीकृत उत्तर एक बहुत अच्छा है (मैंने इसे भी अपडाउन किया है), यह उत्तर अधिक अनुरक्षण विकल्प है।
एरोन

4

आप एक श्रेणी आंशिक और एक उत्पाद आंशिक जोड़ सकते हैं, प्रत्येक मुख्य मॉडल का एक छोटा हिस्सा लेगा क्योंकि यह स्वयं का मॉडल है, अर्थात श्रेणी का मॉडल प्रकार एक IEnumerable हो सकता है, आप इसे Model.Theme में पास करेंगे। उत्पाद का आंशिक एक IEnumerable हो सकता है जिसे आप Model.Products से (श्रेणी के भीतर से) पास करते हैं।

मुझे यकीन नहीं है कि आगे सही रास्ता होगा, लेकिन जानने में दिलचस्पी होगी।

संपादित करें

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


मेरे साथ ऐसा हुआ था, मुझे यकीन नहीं था कि जब मैं इसे अपडेट करने के लिए पढ़ूंगा तो इसे कैसे संभालूंगा।
डेविड सी

1
यह करीब है, लेकिन चूंकि यह एक इकाई के रूप में पोस्ट किया जाने वाला एक रूप है, इसलिए यह काफी सही काम नहीं करेगा। एक बार आंशिक रूप से दृश्य संदर्भ बदल गया है और इसकी अब गहरी नेस्टेड अभिव्यक्ति नहीं है। Themeमॉडल पर वापस पोस्ट करना ठीक से हाइड्रेटेड नहीं होगा।
जे। होम्स

यही मेरी चिंता भी है। मैं आमतौर पर उपरोक्त को केवल उत्पादों को प्रदर्शित करने के लिए एक रीडिंग एप्रोच के रूप में करता हूं और फिर प्रत्येक उत्पाद पर एक लिंक प्रदान कर सकता हूं कि यह एक / उत्पाद / संपादित करें / 123 एक्शन विधि है जो प्रत्येक को स्वयं के रूप में संपादित कर सकता है। मुझे लगता है कि आप एमवीसी में एक पृष्ठ पर बहुत अधिक करने की कोशिश कर सकते हैं।
एड्रियन थॉम्पसन फिलिप्स

@AdrianThompsonPhillips हाँ यह बहुत संभव है कि मेरे पास है। मैं एक फॉर्म बैकग्राउंड से आया हूं, इसलिए मैं अभी भी हमेशा एक संपादन करने के लिए पेज छोड़ने के विचार के आदी नहीं हो सकता। :(
डेविड सी

2

जब आप बाइंडेड मॉडल के लिए दृश्य के भीतर फ़ॉरच लूप का उपयोग कर रहे हैं ... आपका मॉडल सूचीबद्ध प्रारूप में होना चाहिए।

अर्थात

@model IEnumerable<ViewModels.MyViewModels>


        @{
            if (Model.Count() > 0)
            {            

                @Html.DisplayFor(modelItem => Model.Theme.FirstOrDefault().name)
                @foreach (var theme in Model.Theme)
                {
                   @Html.DisplayFor(modelItem => theme.name)
                   @foreach(var product in theme.Products)
                   {
                      @Html.DisplayFor(modelItem => product.name)
                      @foreach(var order in product.Orders)
                      {
                          @Html.TextBoxFor(modelItem => order.Quantity)
                         @Html.TextAreaFor(modelItem => order.Note)
                          @Html.EditorFor(modelItem => order.DateRequestedDeliveryFor)
                      }
                  }
                }
            }else{
                   <span>No Theam avaiable</span>
            }
        }

मुझे आश्चर्य है कि ऊपर का कोड भी संकलन करता है। @ Html.LabelFor को पैरामीटर के रूप में FUNC ऑपरेशन की आवश्यकता होती है, आपका नहीं
जेना लीफ

मुझे नहीं पता कि ऊपर का कोड कंपाइल है या नहीं, लेकिन नेस्टेड @foreach मेरे लिए काम करता है। MVC5।
एंटोनियो

0

यह त्रुटि से स्पष्ट है।

HtmlHelpers ने "For" के साथ जोड़ा, एक पैरामीटर के रूप में लैम्ब्डा अभिव्यक्ति की अपेक्षा करता है।

यदि आप सीधे मूल्य पारित कर रहे हैं, तो सामान्य का बेहतर उपयोग करें।

जैसे

TextboxFor (....) के बजाय Textbox () का उपयोग करें

TextboxFor के लिए सिंटैक्स Html.TextBoxFor (m => m.Property) की तरह होगा

अपने परिदृश्य में आप लूप के लिए मूल का उपयोग कर सकते हैं, क्योंकि यह आपको उपयोग करने के लिए सूचकांक देगा।

@for(int i=0;i<Model.Theme.Count;i++)
 {
   @Html.LabelFor(m=>m.Theme[i].name)
   @for(int j=0;j<Model.Theme[i].Products.Count;j++) )
     {
      @Html.LabelFor(m=>m.Theme[i].Products[j].name)
      @for(int k=0;k<Model.Theme[i].Products[j].Orders.Count;k++)
          {
           @Html.TextBoxFor(m=>Model.Theme[i].Products[j].Orders[k].Quantity)
           @Html.TextAreaFor(m=>Model.Theme[i].Products[j].Orders[k].Note)
           @Html.EditorFor(m=>Model.Theme[i].Products[j].Orders[k].DateRequestedDeliveryFor)
      }
   }
}

0

एक और बहुत सरल संभावना यह है कि आपकी संपत्ति में से एक नाम गलत है (शायद एक जिसे आपने अभी कक्षा में बदला है)। यह मेरे लिए RazorPages .NET कोर 3 में था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.