_ভিউস্টার্ট.কোশটিএমএল লেআউট ফাইলটি কোথায় এবং কীভাবে সংযুক্ত রয়েছে?


199

এখানে ডিফল্ট এমভিসি 3 টেম্পলেট থেকে About.cshtml রয়েছে:

@{
    ViewBag.Title = "About Us";
}

<h2>About</h2>
<p>
     Put content here.
</p>

আমি প্রত্যাশা করব যে _ভিউস্টার্ট ফাইলটির জন্য একটি রেফারেন্স পাওয়া যাবে About.cshtmlতবে এটি স্পষ্টভাবে তা নয়।

আমি সন্ধান করেছি global.asaxএবং web.configপেয়েছি, কিন্তু About.cshtml_ভিস্টার্ট ফাইল থেকে বিন্যাসের সাথে ফাইলটি কীভাবে "সংযুক্ত" রয়েছে তা আমি খুঁজে পাই না ।

সবকিছু প্রত্যাশার মতো কাজ করে, আমি কেবল জানতে চাই যে হুডের নীচে কী চলছে ...

উত্তর:


237

থেকে ScottGu এর ব্লগ :

এএসপি.নেট এমভিসি 3 বিটা রিলিজ দিয়ে শুরু করে, আপনি এখন আপনার প্রকল্পের \ ভিউ ফোল্ডারের নীচে _ ভিউস্টার্ট.একটিএমটিএল (বা ভিবিটির জন্য _ভিউস্টার্ট.ভিবিএইচটিএমএল) নামে একটি ফাইল যুক্ত করতে পারেন:

_ভিউস্টার্ট ফাইলটি প্রতিটি ভিউ রেন্ডারিংয়ের শুরুতে আপনি যে সাধারণ ভিউ কোডটি কার্যকর করতে চান তা নির্ধারণ করতে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, আমরা আমাদের _ভিউস্টার্ট.একএসটিএমএল ফাইলের মধ্যে কোডটি প্রোগ্রামালিমে প্রতিটি ভিউর জন্য ডিফল্টরূপে সাইটলয়েট সিআরটিএমএল ফাইল হিসাবে লেআউট বৈশিষ্ট্য নির্ধারণ করতে কোড লিখতে পারি:

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

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

এটি অনেকগুলি ইউআই নমনীয়তা সক্ষম করে। এটি আপনাকে আরও সহজে দেখার যুক্তি একবারে লিখতে দেয় এবং একাধিক জায়গায় এটিকে পুনরাবৃত্তি করা এড়াতে দেয়।

আরো দেখুন এই


14
তাহলে এটি এমভিসি 3 এর কম-বেশি একটি "হার্ডকোডযুক্ত" বৈশিষ্ট্য? আমার এটি অন্য "ডিফল্ট" পৃষ্ঠায় পরিবর্তন করার দরকার নেই, এটি কীভাবে সেটআপ হয়েছিল তা সম্পর্কে কৌতূহল। এটিকে সব সাজানোর জন্য ধন্যবাদ :)
কমমান

2
Kman- হার্ডকোডযুক্ত, কনভেনশন অনুসারে (এখানে অন্য একটি 'হ্যান্ডেল' চয়ন করুন :)) - তাই হ্যাঁ, ঠিক। খুশি
হ'ল

এটি কেবল আপনার "ভিউজ" ফোল্ডারে নয় যে আপনার এটির প্রয়োজন হতে পারে। যদি আপনি অন্য ফোল্ডারে ভিউগুলি সংগঠিত করতে একটি কাস্টম রেজারভিউইনগাইন যুক্ত করেন তবে আপনাকে সেই বিকল্প বিকল্প ফোল্ডারগুলির মূলের মধ্যেও ফাইলটি অন্তর্ভুক্ত করতে হবে। উদাহরণস্বরূপ, আমি সমস্ত ইন্সপিনিয়া টেম্পলেট ভিউগুলি একটি ফোল্ডারে স্থানান্তরিত করেছি এবং ভিউ ইঞ্জিনে এটি চালিয়েছি ViewLocationFormats = ViewLocationFormats.Union(new string[] { "~/Inspinia/ExampleViews/{1}/{0}.cshtml" }).ToArray();। ফলস্বরূপ, আমাকে আমার _ভিউস্টার্ট। সিটিএসটিএমএল ফাইলের একটি অনুলিপি "~ / ইন্সপিনিয়া / উদাহরণভিউস" এ যুক্ত করতে হয়েছিল, অন্যথায় এটি তোলা হয়নি এবং কোনও বিন্যাস সেট করা হয়নি।
ট্রায়ঙ্কো

2
যদি আপনার ভিউজ ফোল্ডারে সাবফোল্ডার থাকে তবে _ViewStartআপনি কি প্রতিটি সাবফোল্ডারটিতে এমন একটি রাখতে পারেন যা সেই সাবফোল্ডারটিতে দেখা সংস্থাগুলির সাথে লিঙ্ক করবে?
টুডমো

35

আরও সাধারণ অর্থে এমভিসি কাঠামোর এই ক্ষমতা _ ভিউস্টার্ট সি.এস.টি.এম.এল. সম্পর্কে "জানতে" বলা হয় "কনভেনশন বাই কোডিং"।

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

উইকিপিডিয়া

এটিতে কোনও জাদু নেই। এটি কেবল এমভিসি কাঠামোর মূল কোডবেজে লেখা হয়েছে এবং সুতরাং এমভিসি সম্পর্কে "জানে" এমন একটি বিষয়। যে কারণে আপনি এটি .ফনফাইলে ফাইল বা অন্য কোথাও খুঁজে পান না; এটি আসলে এমভিসি কোডে। তবে আপনি এই সম্মেলনগুলি পরিবর্তন বা বাতিল করতে ওভাররাইড করতে পারেন।


13
যদি এমভিসি এটি সম্পর্কে জানে, তবে কেন ভিজ্যুয়াল স্টুডিওটি আমাকে তা জানে এবং নির্দেশ করে না? কনভেনশন দ্বারা কোডিংয়ের অর্থ যদি আপনি কনভেনশনটি ভেঙে না
ফেলেন

সম্মেলন ভঙ্গ না করা বিষয়টির মতো। একেলে রুবে অন রেলও এই দৃষ্টান্ত অনুসরণ করে।
উমর ফারুক খাজা

+1 রাইফ। খারাপভাবে নথিভুক্ত "কনভেনশন বাই কোডিং" রক্ষার কোনও মানে নেই। আমি আমার পিছনের কোডগুলির কোনও সম্পর্কে এটি বলতে পারি। "কি? আপনি যখন 33 এ পৌঁছেছিলেন তখন এটি ক্র্যাশ হওয়ার প্রত্যাশা করেননি? সবাই জানেন আপনি 33 এড়িয়ে গেছেন।" দুর্ভাগ্যক্রমে, এএসপি.নেট এমভিসির জন্য ডকুমেন্টেশনের ব্যবধানটি বিশাল। কেবলমাত্র এমএস ডক্স অভ্যন্তরীণ উত্সের সারসংক্ষেপগুলি না দিয়ে স্বয়ংক্রিয়ভাবে উত্পন্ন।
শানোন

6
কনফিগারেশন উপর কনভেনশন এর অর্থ এই নয় যে আপনি এটি পরিবর্তন করতে পারবেন না। সেখানে ফাইলের নাম এবং অবস্থান নির্দিষ্ট করতে সক্ষম হওয়ার জন্য কনফিগারেশন উপস্থিত থাকতে হবে। খুব ভাল থাকতে পারে, তবে কে তা কে জানে। লোকেরা "কনভেনশন ওভার কনফিগারেশন" মন্ত্রটি ব্যবহার করে একটি কোডবেসে প্রচুর দুর্বল সিদ্ধান্ত coverেকে রাখে এবং এই "আমাকে ঠিক কাজ করে" যে খারাপ তথ্য-প্রমাণিত জগাখিচুড়ি ধরে রাখার জন্য সত্যিকারের সাথে আগত সেই লোক হিসাবে আমাকে বিরক্ত করেছিল। আপনাকে কিছু পরিবর্তন করতে Godশ্বর-নিষেধ করুন - আপনি কীভাবে সমস্ত কিছু ভেঙে ফেলেছেন তা নির্ধারণের জন্য আপনি কয়েক ঘন্টা ব্যয় করবেন)।
রবার্ট সি বার্থ

3
পছন্দ করুন গৃহীত উত্তরটি আসলে আমাকে _ভিস্টার্টটি কীভাবে ব্যবহার করতে হয় তা বলে। এই উত্তরটি কেবল একটি নকশা ধারণা সম্পর্কে কথা বলে। আমি _ভিউস্টার্ট সম্পর্কিত তথ্যের জন্য এখানে এসেছি, কেন ভিজুয়াল স্টুডিও আমাকে _ভিউ স্টার্ট সম্পর্কে কিছু বলবে না about
মিলি স্মিথ

23

অন্য একটি চিন্তা।

আপনি যদি নিজের cshtmlফাইলটি একটি সাধারণ টেম্পলেট হিসাবে রাখতে চান তবে আপনি এটি এইভাবে করতে পারেন

আপনার মধ্যে _viewstart.cshtmlআপনি আপনার সাধারণ cshtmlফাইলটি উল্লেখ করতে পারেন ।

@{Layout = "~/Views/Shared/_Layout.cshtml";}

14

উত্স কোডটি ডকুমেন্টেশনের চেয়ে এটির জন্য আরও ভাল জায়গা।

গিথুব থেকে এমভিসি 6 কোড উল্লেখ করে আমাদের কয়েকটি আগ্রহের ফাইল রয়েছে

----হালনাগাদ----

উৎস গঠন পরিবর্তনগুলির কারণে, কিভাবে viewstart পৃষ্ঠাগুলি সংগৃহীত হয় উপর তথ্য এখন খুঁজে পাওয়া যেতে পারে RazorViewEngine.cs "GetViewStartPages" ফাংশন জন্য চেহারা।

----/হালনাগাদ----

তারা কীভাবে খেলতে আসে তার জবাব দিতে, রেজারভিউ দেখুন , যা আমি বিশ্বাস করি (আইভিউয়ের কারণে) এমভিসি পাইপলাইনে আবদ্ধ। এই ফাইলটিতে একটি রেন্ডারঅ্যাসেন্স পদ্ধতি রয়েছে যা অনুরোধ করা ভিউ রেন্ডার জন্য এমভিসি পাইপলাইন থেকে কল করে।

রেন্ডারঅ্যাসেন্স রেন্ডারপেজ এবং তারপরে রেন্ডারএলআউটকে কল করুন (অর্ডারটি দ্রষ্টব্য)। রেন্ডারপেজ প্রথমে ভিউস্টার্ট ফাইলগুলি মোকাবেলার জন্য কল দেয় (দ্রষ্টব্য বহুবচন, একাধিক _ ভিউস্টার্ট ফাইল থাকতে পারে)।

সুতরাং, আপনি যে তথ্যটি সন্ধান করছেন তা Microsoft.AspNet.Mvc.Razor নেমস্পেসের আওতায় রেজারভিউ.সি.এস ফাইলটিতে রেন্ডারভিউ স্টার্টএন্সিঙ্ক ফাংশন থেকে পাওয়া যাবে ।


7

এটি এই প্রশ্নের এখনই কিছু সংযোজন তথ্য যুক্ত করতে পারে (2016 আলা এমভিসি 4, এমভিসি 5)।

রেজার ইঞ্জিনটি _ViewStart.cshtml পাওয়া যায় এমন একই ডিরেক্টরি বা সাব-ডিরেক্টরিতে থাকা অন্য যে কোনও কোডের আগে _ ভিউস্টার্ট

যে কোনও ভিউ লেআউট সম্পত্তি বা এর কোনও মানকে ওভাররাইড করতে পারে ।

ভেবেছি আমি _ ভিউস্টার্ট কেন তা আপনাকে দেখানোর জন্য আমি আরও কিছু তথ্য যুক্ত করতে পারি।

আপনি যদি আইএলএসপি পেয়ে থাকেন এবং রেজারভিউইঙ্গাইন (System.Web.Mvc.dll) তে কোডটি পরীক্ষা করে দেখেন যে কোডটি নিজেই সেই নামটির উল্লেখ করেছে।

System.Web.Mvc.dll ইন ভিউস্টার্ট

আপনি দেখতে পাচ্ছেন যে রেজারভিউজাইন এই নামের একটি ফাইল সন্ধান করে:

রেজারভিউজেনিন কোড

RazorViewEngine.ViewStartFileName = "_ViewStart";

3
এটি যা আমি খুঁজছিলাম, আমি ঘৃণা করি "জানি না" আমার প্রকল্পে কী চলছে, কারণ আমি ভিএস এর জন্য আমার নিজস্ব টেম্পলেটগুলিও করছি এবং এই ফাইলটি কেবল বায়ু থেকে বেরিয়ে এসেছিল তা বোঝার জন্য খুব অযৌক্তিক ছিল
সেবাস্তিয়ান 506563

1

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


1

সংক্ষিপ্ত উত্তরটি হ'ল : ভিউ স্টার্টস শুরু হয় যখন কোনও ভিউ রেন্ডার করা হয়। দীর্ঘ গল্পটি নীচে রয়েছে:

একটি একক ভিউ ফাইল তৈরির গল্প:

  1. ভিউস্টার্টটি ভিউ ইমপোর্টগুলির সাথে একত্রীকরণ করা হয় এবং তারপরে একটি একক ফাইল হিসাবে কার্যকর করা হয়। দ্রষ্টব্য যে ভিউআইপোর্টগুলি সর্বদা ভিউস্টার্ট ফাইল সহ যে কোনও সিএসটিএমএল ফাইলের সাথে একত্রীকরণ করা হয়। এর উদ্দেশ্য হল @ বিবৃতির বিবরণ এবং অন্যান্য সাধারণ নির্দেশাবলী বিমূর্ত করা।
  2. ভিউস্টার্টের আউটপুট (যেমন লেআউট এবং ভিউ ডেটা) নির্দিষ্ট ভিউ ফাইলের জন্য উপলব্ধ।
  3. ভিউ ফাইলের অভ্যন্তরে, যদি লেআউট ভেরিয়েবলটি নাল / হয়ে যায় তবে ভিউটির মূল অংশটি রেন্ডার করা হয় এবং চূড়ান্ত আউটপুট ব্যবহারকারীর কাছে সরবরাহ করা হয়।
  4. যদি লেআউট ভেরিয়েবলটি নাল / না হয়ে যায় তবে এক্সিকিউশনটি লেআউট ফাইলে সরানো হয় যা ঘুরেফিরে একক ফাইল হিসাবে ভিউ ইমপোর্টগুলির সাথে একত্রীভূত হয় এবং তারপরে লেআউট ফাইলের প্রয়োগের ভিতরে @RenderBody () বিবৃতিতে আবার ভিউ ফাইলটিতে সরিয়ে ফেলা হয় যা আবার ভিউআইম্পোর্টগুলির সাথে আবার একত্রিত হয় এবং আউটপুটটি @RenderBody () এর অবস্থানে লেআউট ফাইলের সাথে একত্রী হয় এবং চূড়ান্ত আউটপুটটি শেষ পর্যন্ত ব্যবহারকারীর কাছে সরবরাহ করা হয়।

আশা করি এটি আপনাকে আপনার প্রোগ্রামের জীবনচক্রের অজানা রহস্যের ভিতরে কী ঘটছে তা সচেতন করে তোলে।

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