এমভিসি রেজার ভিউ নেস্টেড ফোরচের মডেল


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)
      }
   }
}

আমি যদি এর পরিবর্তে ল্যাম্বদা ব্যবহার করি তবে আমি কেবল শীর্ষ মডেল অবজেক্ট "থিম" -র পূর্ববর্তী লুপের মধ্যে নেই বলে মনে করি a

আমি সেখানে যা করার চেষ্টা করছি তা কি সম্ভব বা আমি কীভাবে সম্ভব তার চেয়ে বেশি মূল্যায়ন করেছি বা ভুল বুঝেছি?

উপরের সাহায্যে আমি টেক্সটবক্সফোর, এডিটরফোর্স ইত্যাদিতে ত্রুটি পাই

CS0411: পদ্ধতি 'System.Web.Mvc.Html.InputExtensions.TextBoxfor (System.Web.Mvc.HtmlHelper, System.Linq.Expressions.Expression>)' এর ধরণের আর্গুমেন্টগুলি ব্যবহার থেকে অনুমান করা যায় না। প্রকারের আর্গুমেন্টগুলি স্পষ্ট করে উল্লেখ করার চেষ্টা করুন।

ধন্যবাদ


4
আপনার @সব আগে করা উচিত নয় foreach? আপনারও Html.EditorFor( Html.EditorFor(m => m.Note)যেমন, উদাহরণস্বরূপ) এবং অন্যান্য পদ্ধতিতে ল্যাম্বডাস থাকা উচিত নয় ? আমার ভুল হতে পারে তবে আপনি কি আপনার আসল কোডটি পেস্ট করতে পারবেন? আমি এমভিসিতে বেশ নতুন, তবে আপনি এটি আংশিক দর্শন বা সম্পাদকদের (যদি নাম হয় তবে?) দিয়ে এটি সহজেই সমাধান করতে পারেন।
কোবি

category.nameআমি নিশ্চিত যে এটি একটি stringএবং ...Forপ্রথম প্যারামিটার হিসাবে কোনও স্ট্রিং সমর্থন করে না
বেলেক্সান্দ্রে

হ্যাঁ, আমি এখনই যুক্ত করা @ এর গুলি মিস করেছি। ধন্যবাদ তবে ল্যাম্বডা হিসাবে যদি আমি @ এইচটিএমএল.টেক্সটবক্সফোর্ড (এম => মি) টাইপ করতে শুরু করি তবে আমি কেবল শীর্ষ মডেল অবজেক্টের জন্য একটি রেফারেন্স পেয়েছি বলে মনে হচ্ছে না,
ডেভিড সি

@ ডেভিডসি - আমি এখনও এমভিসি 3 জবাব দিতে পর্যাপ্ত পরিমাণে জানি না - তবে আমি সন্দেহ করি এটি আপনার সমস্যা :)
কোবি

4
আমি ট্রেনে আছি, তবে সময় মতো উত্তর না পেলে আমি অসুস্থ হয়ে পড়ি একটি উত্তর পোস্ট করে। দ্রুত উত্তরের একটি নিয়মিত ব্যবহার করা 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)
      }
   }
}

তবে কেন এটি সমস্যার সমাধান করে তা নিয়ে এই সমস্যাগুলি প্রকাশিত হয়।

এই সমস্যাটি সমাধান করার আগে আপনার কাছে তিনটি জিনিস রয়েছে যা কমপক্ষে একটি কারসারি বোঝা। আমাকে স্বীকার করতে হবে যে যখন আমি কাঠামোটি নিয়ে কাজ শুরু করি তখন আমি এটিকে দীর্ঘ সময়ের জন্য কার্গো-সিলেট করেছিলাম। যা ঘটছে তা পেতে পেতে আমার বেশ খানিকটা সময় লেগেছিল

এই তিনটি জিনিস হ'ল:

  • এমভিসিতে কীভাবে LabelForঅন্যান্য ...Forসহকারীরা কাজ করবেন?
  • একটি এক্সপ্রেশন ট্রি কি?
  • মডেল বাইন্ডার কীভাবে কাজ করে?

এই ধারণাগুলির তিনটিই একটি উত্তর পেতে লিংক করেছে।

এমভিসিতে কীভাবে 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>>

সুতরাং যখন আপনি সাধারণত একটি ল্যাম্বদা উত্পন্ন করেন, সংকলকটি লম্বাটি নিয়ে যায় এবং এমএসআইএল-তে এটি সংকলন করে, অন্য কোনও ফাংশনের মতো (যার কারণে আপনি প্রতিনিধি, পদ্ধতি গ্রুপ এবং ল্যাম্বডাস আরও বা কম বিনিময়যোগ্যভাবে ব্যবহার করতে পারেন, কারণ এগুলি কেবল কোডের উল্লেখ ।)

যাইহোক, সংকলকটি দেখতে পায় যে প্রকারটি একটি 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<>তা নয়, এটি কীভাবে এটি কাজ করে তা এখানে গুরুত্বপূর্ণ।

(লিনকু থেকে এসকিউএল এর মতো অন্যান্য কাঠামোগুলি নোট করুন যেমন একটি এক্সপ্রেশন ট্রিতে হাঁটতে এবং একটি ভিন্ন ব্যাকরণ তৈরি করে যেমন এই ক্ষেত্রে একটি এসকিউএল কোয়েরি করে)

মডেল বাইন্ডার কীভাবে কাজ করে?

সুতরাং একবার আপনি এটি পেতে, আমরা সংক্ষেপে মডেল বাইন্ডার সম্পর্কে কথা বলতে হবে। ফর্মটি পোস্ট হয়ে গেলে, এটি কেবল একটি ফ্ল্যাটের মতো Dictionary<string, string>, আমরা আমাদের নেস্টেড ভিউ মডেলটির যে স্তরক্রমিক কাঠামোটি পেয়েছি তা হারিয়ে ফেলেছি। এই কী-মান জুটির কম্বো নেওয়া এবং কিছু বৈশিষ্ট্য সহ কোনও বস্তুকে পুনরায় হাইড্রেট করার চেষ্টা করা মডেল বাইন্ডারের কাজ। এটা কিভাবে কাজ করে? আপনি "কী" বা পোস্ট হওয়া ইনপুটটির নাম ব্যবহার করে অনুমান করেছিলেন।

সুতরাং যদি ফর্ম পোস্ট মত লাগে

Foo.Bar.Baz.FooBar = Hello

এবং আপনি যাকে বলা মডেলটিতে পোস্ট করছেন SomeViewModel, তারপরে এটি সহায়তাকারী প্রথম স্থানে যা করেছিল তার বিপরীত কাজ করে। এটি "ফু" নামে একটি সম্পত্তি অনুসন্ধান করে। তারপরে এটি "ফু" বন্ধ করে "বার" নামক একটি সম্পত্তি অনুসন্ধান করে, তারপরে এটি "বাজ" সন্ধান করে ... এবং আরও কিছু ...

অবশেষে এটি "FooBar" টাইপের মধ্যে মানটি বিশ্লেষণ করার চেষ্টা করে এবং এটি "FooBar" এ নির্ধারণ করে।

PHW !!!

এবং ভয়েলা, আপনি আপনার মডেল আছে। সবেমাত্র নির্মিত মডেল বাইন্ডারটি অনুরোধ করা অ্যাকশনে হস্তান্তরিত হয়।


সুতরাং আপনার সমাধান কাজ করে না কারণ Html.[Type]For()সাহায্যকারীদের একটি অভিব্যক্তি প্রয়োজন। এবং আপনি কেবল তাদের একটি মান দিচ্ছেন। মানটির জন্য প্রসঙ্গটি কী তা এটির কোনও ধারণা নেই এবং এটি কী করতে হবে তা জানে না।

এখন কিছু লোক রেন্ডার করতে পার্টিয়ালগুলি ব্যবহারের পরামর্শ দিয়েছে। এখন এটি তাত্ত্বিকভাবে কাজ করবে, তবে সম্ভবত আপনি যেভাবে প্রত্যাশা করেছিলেন তা নয়। আপনি যখন আংশিক রেন্ডার করেন, আপনি প্রকারটি পরিবর্তন করছেন TModel, কারণ আপনি অন্যরকম দৃশ্যের প্রসঙ্গে। এর অর্থ হ'ল আপনি নিজের সম্পত্তিটিকে একটি স্বল্প সংক্ষেপে বর্ণনা করতে পারবেন। এর অর্থ হ'ল সহায়ক যখন আপনার অভিব্যক্তির জন্য নাম উত্পন্ন করবে তখন তা অগভীর হবে। এটি কেবলমাত্র প্রদত্ত প্রকাশের ভিত্তিতে উত্পন্ন হবে (সম্পূর্ণ প্রসঙ্গ নয়)।

সুতরাং আসুন আমরা বলি যে আপনার একটি আংশিক রয়েছে যা "বাজ" রেন্ডার করেছে (আমাদের উদাহরণ থেকে আগে)। এই আংশিক ভিতরে আপনি কেবল বলতে পারেন:

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

বরং

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

তার মানে এটি এর মতো একটি ইনপুট ট্যাগ তৈরি করবে:

<input name="FooBar" />

কোনটি, যদি আপনি এই ফর্মটি এমন কোনও ক্রিয়াতে পোস্ট করছেন যা একটি বৃহত্তর গভীরভাবে নেস্ট করা ভিউমোডেলের প্রত্যাশা করে, তবে এটি FooBarঅফ অফ বলে সম্বলিত হাইড্রেট করার চেষ্টা করবে TModel। যা সর্বোত্তম সেখানে নেই এবং সবচেয়ে খারাপটি সম্পূর্ণরূপে অন্যরকম। আপনি যদি কোনও নির্দিষ্ট ক্রিয়াতে পোস্ট করে Bazযা রুট মডেলের পরিবর্তে কোনও গ্রহণ করে , তবে এটি দুর্দান্ত কাজ করবে! প্রকৃতপক্ষে, পার্টিয়ালগুলি আপনার দর্শন প্রসঙ্গে পরিবর্তন করার একটি ভাল উপায়, উদাহরণস্বরূপ যদি আপনার একাধিক ফর্মযুক্ত একটি পৃষ্ঠা থাকে যা সমস্ত ক্রিয়াকলাপে পোস্ট করে থাকে তবে প্রত্যেকটির জন্য একটি আংশিক রেন্ডারিং একটি দুর্দান্ত ধারণা হবে।


এখন আপনি যখন এই সমস্ত কিছু পেয়ে যান, আপনি Expression<>ক্রমবর্ধমানভাবে সেগুলি প্রসারিত করে এবং তাদের সাথে অন্যান্য ঝরঝরে জিনিসগুলি সহ সত্যই আকর্ষণীয় জিনিসগুলি শুরু করতে পারেন । আমি এর কোনটিতে won'tুকব না। তবে, আশা করি, এটি আপনাকে পর্দার আড়ালে কী চলছে এবং কেন জিনিসগুলি সেভাবে আচরণ করছে সে সম্পর্কে আরও ভাল ধারণা দেবে।


4
দুর্দান্ত উত্তর আমি বর্তমানে এটি হজম করার চেষ্টা করছি। :) কার্গো কাল্টিংয়ের জন্যও দোষী! সেই বিবরণটি পছন্দ করুন।
ডেভিড সি

4
এই বিস্তারিত উত্তরের জন্য আপনাকে ধন্যবাদ!
কোবি

14
এই জন্য একাধিক upvote প্রয়োজন। +3 (প্রতিটি ব্যাখ্যার জন্য একটি) এবং কার্গো-কাল্টিস্টদের জন্য +1। একেবারে উজ্জ্বল উত্তর!
কিয়োটিক

4
এ কারণেই আমি SO- কে খুব পছন্দ করি: সংক্ষিপ্ত উত্তর + গভীরতার বিবরণ + দারুণ লিঙ্ক (কার্গো-কাল্ট)। কার্গো-কাল্ট সম্পর্কে পোস্টটি আমি এমন কাউকে দেখাতে চাই যাঁরা মনে করেন না যে স্টাফের অভ্যন্তরীণ কাজ সম্পর্কে জ্ঞান অত্যন্ত গুরুত্বপূর্ণ!
ব্যবহারকারী 1068352

18

এটি করার জন্য আপনি কেবল এডিটর টেম্পলেটগুলি ব্যবহার করতে পারেন, আপনাকে আপনার নিয়ামকের ভিউ ফোল্ডারে "EditorTemplates" নামে একটি ডিরেক্টরি তৈরি করতে হবে এবং আপনার প্রতিটি নেস্টেড সত্তার জন্য পৃথক দৃষ্টিভঙ্গি স্থাপন করতে হবে (সত্তার শ্রেণীর নাম হিসাবে নাম দেওয়া হয়েছে)

প্রধান দর্শন:

@model ViewModels.MyViewModels.Theme

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

বিভাগ ভিউ (/ আমারকন্ট্রোলার / এডিটর টেম্পলেটগুলি / ক্যাটাগরি.কোশটিএমএল):

@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)

ইত্যাদি

এই ভাবে এইচটিএমএল.এডিটরটির জন্য সহায়ক একটি আদেশযুক্ত পদ্ধতিতে উপাদানটির নাম উত্পন্ন করবে এবং সুতরাং পোস্ট করা থিম সত্তাকে পুরোপুরি পুনরুদ্ধার করার জন্য আপনার আর কোনও সমস্যা হবে না


4
যদিও স্বীকৃত উত্তরটি খুব ভাল একটি (আমি এটিও উন্নীত করেছি), এই উত্তরটি আরও রক্ষণাবেক্ষণযোগ্য বিকল্প।
হারুন

4

আপনি একটি বিভাগ আংশিক এবং একটি পণ্য আংশিক যোগ করতে পারেন, প্রতিটি নিজস্ব মডেল হিসাবে মূল মডেলের একটি ছোট অংশ গ্রহণ করবে, যেমন বিভাগের মডেল প্রকারটি একটি অনুমিত হতে পারে, আপনি মডেলটিতে পাস করতে পারেন me এটিতে এটি me পণ্যের আংশিক একটি মডেল হতে পারে এমন মডেল হতে পারে P

আমি নিশ্চিত নই যে এটি যদি সঠিক পথে এগিয়ে যায় তবে তা জানতে আগ্রহী।

সম্পাদনা

এই উত্তরটি পোস্ট করার পরে, আমি সম্পাদকপদগুলি ব্যবহার করেছি এবং পুনরায় ইনপুট গ্রুপ বা আইটেমগুলি হ্যান্ডেল করার সবচেয়ে সহজ উপায় এটি খুঁজে পেয়েছি। এটি আপনার সমস্ত বৈধতা বার্তা সমস্যাগুলি পরিচালনা করে এবং স্বয়ংক্রিয়ভাবে জমা দেওয়ার / মডেল বাঁধার সমস্যাগুলিকে ফর্ম করে।


এটি আমার কাছে ঘটেছিল, যখন আমি আপডেটটি পড়তে পড়ি তখন এটি কীভাবে পরিচালনা করবে তা নিশ্চিত ছিল না।
ডেভিড সি

4
এটি কাছে, তবে যেহেতু এটি ইউনিট হিসাবে পোস্ট করার ফর্ম তাই এটি ঠিক কাজ করবে না। আংশিক ভিতরে একবার দেখার প্রেক্ষাপট পরিবর্তিত হয়ে যায় এবং এর আর গভীরভাবে নেস্টেড এক্সপ্রেশন থাকে না। Themeমডেলটিতে ফিরে পোস্ট করা সঠিকভাবে হাইড্রেটেড হবে না।
জে. হোমস

এটাও আমার উদ্বেগের বিষয়। আমি পণ্যগুলি প্রদর্শন করার জন্য কেবলমাত্র পঠিত পদ্ধতির হিসাবে উপরেরটিটি করতাম এবং তারপরে প্রতিটি পণ্যের নিজস্ব লিখিতভাবে সম্পাদনা করার জন্য একটি পণ্য / সম্পাদনা / 123 ক্রিয়া পদ্ধতিতে প্রতিটি পণ্যের একটি লিঙ্ক সরবরাহ করতাম। আমি মনে করি আপনি এমভিসিতে একটি পৃষ্ঠায় খুব বেশি করে করার চেষ্টা করে পূর্বাবস্থায় ফিরে যেতে পারেন।
অ্যাড্রিয়ান থম্পসন ফিলিপস

@ অ্যাড্রিয়ান টমসনফিলিপস হ্যাঁ আমার পক্ষে এটি খুব সম্ভব। আমি ফর্মগুলির পটভূমি থেকে এসেছি, তাই আমি সম্পাদনা করার জন্য পৃষ্ঠাটি রেখে যাওয়ার ধারণাটি এখনও সবসময় অভ্যস্ত করতে পারি না। :(
ডেভিড সি

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>
            }
        }

আমি বিস্মিত যে উপরে কোড এমনকি সংকলন। @ এইচটিএমএল। লেবেলটির প্যারামিটার হিসাবে একটি FUNC অপারেশন প্রয়োজন, আপনার নয়
জেনা লিফ

আমি জানি না উপরের কোডটি সংকলন করা হয়েছে কি না, তবে নেস্টেড @ ফোরফ্যাচ আমার পক্ষে কাজ করে । এমভিসি 5।
আন্তোনিও

0

এটি ত্রুটি থেকে পরিষ্কার।

এইচটিএমএল হেল্পার্স "ফর" দিয়ে যুক্ত হয়ে ল্যাম্বডা এক্সপ্রেশনটিকে প্যারামিটার হিসাবে প্রত্যাশা করে।

আপনি যদি সরাসরি মূল্যটি পাস করে চলেছেন তবে সাধারণটি আরও ভাল ব্যবহার করুন।

যেমন

টেক্সটবক্সফোর (....) এর পরিবর্তে টেক্সটবক্স () ব্যবহার করুন

টেক্সটবক্সফোর জন্য বাক্য গঠনটি এইচটিএমএল এর মতো হবে e পাঠ্যবক্সফোর্ড (এম => মি। প্রপার্টি)

আপনার দৃশ্যে আপনি লুপের জন্য বেসিক ব্যবহার করতে পারেন, কারণ এটি আপনাকে সূচকটি ব্যবহার করতে দেবে।

@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

আরও একটি সহজ সম্ভাবনা হ'ল আপনার সম্পত্তির একটি নাম ভুল (সম্ভবত আপনি ক্লাসে পরিবর্তিত হয়েছিলেন)। রেজারপেজগুলিতে এটি আমার জন্য ছিল N নেট কোর 3।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.