এএসপি.নেট এমভিসি 3 - আংশিক বনাম প্রদর্শন টেম্পলেট বনাম সম্পাদক টেম্পলেট


303

সুতরাং, শিরোনামটি নিজের পক্ষে কথা বলা উচিত।

এএসপি.নেট এমভিসিতে পুনঃব্যবহারযোগ্য উপাদানগুলি তৈরি করতে, আমাদের কাছে 3 টি বিকল্প রয়েছে (অন্যরা হতে পারে যা আমি উল্লেখ করি নি):

আংশিক দেখুন:

@Html.Partial(Model.Foo, "SomePartial")

কাস্টম সম্পাদক টেম্পলেট:

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

কাস্টম প্রদর্শন টেম্পলেট:

@Html.DisplayFor(model => model.Foo)

প্রকৃত ভিউ / এইচটিএমএল এর ক্ষেত্রে, তিনটি বাস্তবায়ন একরকম:

@model WebApplications.Models.FooObject

<!-- Bunch of HTML -->

সুতরাং, আমার প্রশ্নটি হল - আপনি / কখন তিনজনের মধ্যে কোনটি ব্যবহার করবেন তা আপনি কীভাবে সিদ্ধান্ত নেবেন?

আমি আসলে যা খুঁজছি তা হ'ল একটি তৈরির আগে নিজেকে জিজ্ঞাসা করা প্রশ্নগুলির একটি তালিকা, যার জন্য উত্তরগুলি কোন টেমপ্লেটটি ব্যবহার করবেন সে সিদ্ধান্ত নেওয়ার জন্য ব্যবহার করা যেতে পারে।

এডিটরফোর্ড / ডিসপ্লেফোর্ডের সাথে আমি দুটি জিনিস আরও ভাল পেয়েছি:

  1. এইচটিএমএল সহায়তাকারীদের রেন্ডার করার সময় তারা মডেল শ্রেণিবিন্যাসকে সম্মান করে (যেমন আপনার "ফু" মডেলটিতে যদি "বার" অবজেক্ট থাকে তবে "বার" এর এইচটিএমএল উপাদানগুলি "ফু.বার.এলিমেন্ট নাম" দিয়ে রেন্ডার হবে, যখন একটি আংশিক অংশ থাকবে " ElementName ")।

  2. আরও List<T>দৃust়, উদাহরণস্বরূপ, আপনার ভিউমোডেলে যদি আপনার কাছে কিছু থাকে তবে আপনি ব্যবহার করতে পারেন @Html.DisplayFor(model => model.CollectionOfFoo)এবং এমভিসি এটির সংগ্রহ দেখতে এবং প্রতিটি আইটেমের জন্য একক প্রদর্শন সরবরাহ করার জন্য যথেষ্ট পারদর্শী (আংশিক বিপরীতে, যার জন্য একটি স্পষ্ট প্রয়োজন লুপ).

আমি শুনেছি ডিসপ্লেফোর্ড একটি "কেবল পঠনযোগ্য" টেমপ্লেট রেন্ডার করে, তবে আমি তা বুঝতে পারি না - আমি কি সেখানে কোনও ফর্ম ফেলতে পারি না?

কেউ আমাকে অন্য কিছু কারণ বলতে পারেন? তিনটির তুলনা করে কোথাও কি কোনও তালিকা / নিবন্ধ রয়েছে?


সম্পাদক এবং প্রদর্শন টেম্পলেটগুলির পিছনে ধারণাগুলি স্পষ্টভাবে এসপ নেটওয়্যার এমভিসি ২ এর জন্য ডকুমেন্টেশনে সংজ্ঞায়িত করা হয়েছে Temp টেমপ্লেটগুলি একটি নির্দিষ্ট কনভেনশন মেনে চলে এমন পার্টিয়াল। পুরানো অনুচ্ছেদগুলির তুলনায় টেমপ্লেটগুলি যে পরিস্থিতিগুলি উন্নত বা খারাপতর হয় সেগুলি কনভেনশন আপনার আবেদনের সাথে আনুগত্যের মূল্যবান কিনা তা প্রায় কঠোরভাবে নির্ভরশীল।
নিক লারসেন

উত্তর:


301

EditorForবনাম DisplayForসহজ। পদ্ধতির শব্দার্থবিজ্ঞান হ'ল সম্পাদনা / সন্নিবেশ এবং প্রদর্শন / কেবল পঠন দর্শন (যথাক্রমে) তৈরি করা। DisplayForডেটা প্রদর্শন করার সময় ব্যবহার করুন (যেমন আপনি যখন মডেল মানগুলি সহ ডিভ এবং স্প্যানগুলি তৈরি করেন) contain EditorForডেটা সম্পাদনা / সন্নিবেশ করার সময় ব্যবহার করুন (যেমন আপনি যখন কোনও ফর্মের অভ্যন্তরে ইনপুট ট্যাগগুলি তৈরি করেন)।

উপরোক্ত পদ্ধতিগুলি মডেলকেন্দ্রিক। এর অর্থ হ'ল তারা মডেল মেটাডেটাটিকে অ্যাকাউন্টে নেবে (উদাহরণস্বরূপ আপনি মডেলটির সাথে আপনার মডেল শ্রেণির বেনিফিট করতে পারেন [UIHintAttribute]বা [DisplayAttribute]এটি প্রভাবিত করবে যে কোনও টেম্পলেটটি মডেলটির জন্য ইউআই উত্পন্ন করতে পছন্দ করে। এগুলি সাধারণত ডেটা মডেলগুলির জন্যও ব্যবহৃত হয় (যেমন মডেলগুলি যা একটি ডাটাবেসে সারি প্রতিনিধিত্ব, ইত্যাদি)

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

আপনি @Html.Actionএখানে জিজ্ঞাসা করেন নি যে কোনটি এখানেও উল্লেখের দাবি রাখে। আপনি এটিকে আরও শক্তিশালী সংস্করণ হিসাবে ভাবতে পারেন Partialযে এটি একটি নিয়ামক শিশু ক্রিয়া চালায় এবং তারপরে একটি ভিউ রেন্ডার করে (যা সাধারণত আংশিক দৃষ্টিভঙ্গি হয়)। এটি গুরুত্বপূর্ণ কারণ শিশু ক্রিয়া অতিরিক্ত ব্যবসায়িক যুক্তি সম্পাদন করতে পারে যা আংশিক দৃষ্টিতে অন্তর্ভুক্ত নয়। উদাহরণস্বরূপ এটি কোনও শপিং কার্টের উপাদান উপস্থাপন করতে পারে। এটির ব্যবহারের কারণ হ'ল আপনার অ্যাপ্লিকেশনের প্রতিটি কন্ট্রোলারে শপিং কার্ট-সম্পর্কিত কাজ সম্পাদন করা।

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


4
এটি দুর্দান্ত উত্তর, ঠিক আমি যা খুঁজছিলাম। আপনি আসেন এবং এর উত্তর দিতে চান বাস্তবে আমি ব্যাংকিং ছিল। :) ধন্যবাদ মার্সিন
RPM1984

আপনি কোনও একক সম্পত্তির জন্য প্রদর্শন টেম্পলেট এবং সম্পাদক টেম্পলেট নির্দিষ্ট করতে টিকা কীভাবে ব্যবহার করবেন?
ঝড়বৃষ্টি

3
@ স্টারওয়াল্ড হয় হয় কনভেনশন ব্যবহার করে এবং আপনার টেম্পলেটগুলির নাম (/ ভিউস / ডিসপ্লেটিম্পলেটস / মাইমোডেল.cshtml) এর সাথে সম্পর্কিত করে বা স্পষ্টভাবে এটি জোর করে W / UIHint টীকাতে জোর করে।
টম ওয়েইসন

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

আপনি এই টেম্পলেটগুলি কোথায় সঞ্চয় করবেন? আমার কি এগুলি ভাগ করে নেওয়া / সম্পাদক টেম্পলেটগুলিতে সঞ্চয় করা দরকার বা এগুলি সরাসরি বর্তমান নিয়ামক ফোল্ডারে (যখন কেবলমাত্র আমি সেখানে তাদের প্রয়োজন হবে) এগুলি সংরক্ষণ করা সম্ভব?
সান্থোস

15

আপনি অবশ্যই একটি সম্পাদনযোগ্য ফর্ম প্রদর্শন কাস্টমাইজ করতে পারেনDisplayFor । কিন্তু সম্মেলন জন্য DisplayForহতে readonlyএবং EditorForসম্পাদনার জন্য যাবে। কনভেনশনটি DisplayForআটকে রাখার বিষয়টি নিশ্চিত করবে যে আপনি যেভাবেই প্রবেশ করুন না কেন এটি একই ধরণের কাজ করবে।


2
আমি কখনই সম্পাদক টেম্পলেট বনাম প্রদর্শন টেম্পলেট ব্যবহার করা উচিত সে সম্পর্কে সত্যই কোনও প্রশ্ন / সন্দেহ আছে বলে আমি মনে করি না। আসল প্রশ্নটি দেখা যাচ্ছে আপনি কখন টেমপ্লেট বনাম পার্টিয়ালগুলি ব্যবহার করবেন। আপনার উত্তরটি এটিকে পুরোপুরি মিস করে।
জোশুয়া হেইস

19
@ জোশুয়া - আমার মনে হয় এ নিয়ে কিছু প্রশ্ন ছিল: "আমি শুনেছি ডিসপ্লেফোর্ড একটি" পঠনযোগ্য "টেমপ্লেট রেন্ডার করে, কিন্তু আমি বুঝতে পারি না - আমি কি সেখানে কোনও ফর্ম ফেলতে পারি না?"
রবার্ট লেভি

13

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

    <div id="div-@(idPrefix)2" class="toHide-@(idPrefix)" style="display:none">
    <fieldset>
        <label for="@(idPrefix).Frequency">Frequency<span style="color: #660000;"> *</span></label>

        <input name="@(idPrefix).Frequency"
               id="@(idPrefix)_Frequency"
               style="width: 50%;"
               type="text"
               value="@(defaultTimePoint.Frequency)"
               data-bind="value: viewState.@(viewStatePrefix).RecurringTimepoints.Frequency"
               data-val="true"
               data-val-required="The Frequency field is required."
               data-val-number="The field Frequency must be a number."
               data-val-range-min="1"
               data-val-range-max="24"
               data-val-range="The field Frequency must be between 1 and 24."
               data-val-ignore="true"/>

        @Html.ValidationMessage(idPrefix + ".Frequency")

        ... etc

    </fieldset>
</div>

এটি বেশ কুৎসিত হয়েছে তাই আমরা পরিবর্তে সম্পাদক টেম্পলেটগুলি ব্যবহার করার সিদ্ধান্ত নিয়েছি, যা আরও পরিস্কার পরিশ্রম করে। আমরা সাধারণ ক্ষেত্রগুলির সাথে একটি নতুন ভিউ মডেল যুক্ত করেছি, একটি মেলা সম্পাদক টেম্পলেট যুক্ত করেছি এবং বিভিন্ন প্যারেন্ট ভিউগুলি থেকে সম্পাদক টেম্পলেট ব্যবহার করে ক্ষেত্রগুলি রেন্ডার করেছি। সম্পাদক টেম্পলেটটি সঠিকভাবে আইডি এবং নামগুলি সরবরাহ করে।

সুতরাং সংক্ষেপে, আমাদের সম্পাদক টেমপ্লেটগুলি ব্যবহার করার জন্য একটি বাধ্যতামূলক কারণটি হ'ল একাধিক ট্যাবে কিছু সাধারণ ক্ষেত্র রেন্ডার করা। আংশিক দর্শনগুলি এর জন্য ডিজাইন করা হয়নি তবে সম্পাদক টেম্পলেটগুলি দৃশ্যের পুরোপুরি পরিচালনা করে।


1
ট্যাব ব্যবহার করে আমার একই রকম সমস্যা হয়েছিল এবং স্টিভ স্যান্ডারসনের বিগন কালেকশন আইটেমটি ব্যবহার করে শেষ হয়েছিল যা আপনার জন্য অনন্য কন্ট্রোল আইডি উত্পন্ন করে: ব্লগ.স্টেভেনস্যান্ডারসন.com
2010

1

_partialভিউ অ্যাপ্রোচ ব্যবহার করুন যদি:

  1. কেন্দ্রিক যুক্তি দেখুন
  2. _partialএই ভিউটিতে সমস্ত সম্পর্কিত সম্পর্কিত এইচটিএমএল কী রাখবেন । টেমপ্লেট পদ্ধতিতে আপনাকে "প্রধান শিরোনাম বা কোনও বাহ্যিক সীমানা / সেটিংসের মতো টেম্পলেট ভিউয়ের বাইরে কিছু HTML রাখতে হবে।
  3. যুক্তি দিয়ে (নিয়ন্ত্রক থেকে) ব্যবহার করে আংশিক দৃশ্য রেন্ডার করতে চান URL.Action("action","controller")

টেমপ্লেট ব্যবহারের কারণ:

  1. অপসারণ করতে চান ForEach(Iterator)। মডেলটিকে তালিকার ধরণ হিসাবে চিহ্নিত করার জন্য টেমপ্লেট যথেষ্ট। এটি স্বয়ংক্রিয়ভাবে এটি করবে।
  2. মডেল কেন্দ্রিক যুক্তি। যদি একই প্রদর্শনের জন্য টেমপ্লেট ফোল্ডারে একাধিক বার দেখা হয় তবে রেন্ডারিং উত্তীর্ণ মডেলটির উপর নির্ভর করবে।

1

আর একটি পার্থক্য যা এখনও অবধি উল্লেখ করা হয়নি তা হ'ল একটি টেম্পলেটটি করার সময় একটি আংশিক দর্শন মডেল উপসর্গগুলি যুক্ত করে না এখানে সমস্যাটি এখানে রয়েছে

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