আমি যা দেখছি তা হ'ল স্ট্রিং বিন্যাসের সম্পত্তি। তবে আমি কীভাবে কোনও মডেলকে স্পষ্টভাবে বিন্যাসে পাস করতে পারি?
Model
পাওয়া যায় _Layout
। আমি এমভিসি 5 ব্যবহার করছি।
আমি যা দেখছি তা হ'ল স্ট্রিং বিন্যাসের সম্পত্তি। তবে আমি কীভাবে কোনও মডেলকে স্পষ্টভাবে বিন্যাসে পাস করতে পারি?
Model
পাওয়া যায় _Layout
। আমি এমভিসি 5 ব্যবহার করছি।
উত্তর:
দেখে মনে হচ্ছে আপনি যদি নিজের সমস্যাটি থেকে থাকেন তবে আপনার ভিউ মডেলগুলিকে কিছুটা ভুল করেছেন।
ব্যক্তিগতভাবে আমি কোনও লেআউট পৃষ্ঠা কখনও টাইপ করব না। তবে আপনি যদি এটি করতে চান তবে আপনার অন্য ভিউ মডেলগুলি উত্তরাধিকার সূত্রে পাওয়া উচিত এবং আপনার লেআউটটি বেস ভিউ মডেলটিতে টাইপ করুন এবং আপনি নির্দিষ্ট পৃষ্ঠাগুলিতে একবার to
উদাহরণ: নিয়ন্ত্রক:
public class MyController : Controller
{
public MainLayoutViewModel MainLayoutViewModel { get; set; }
public MyController()
{
this.MainLayoutViewModel = new MainLayoutViewModel();//has property PageTitle
this.MainLayoutViewModel.PageTitle = "my title";
this.ViewData["MainLayoutViewModel"] = this.MainLayoutViewModel;
}
}
লেআউট পৃষ্ঠার উদাহরণ শীর্ষ
@{
var viewModel = (MainLayoutViewModel)ViewBag.MainLayoutViewModel;
}
এখন আপনি টাইপ করা অবজেক্টটিতে সম্পূর্ণ অ্যাক্সেসের সাথে আপনার লেআউট পৃষ্ঠায় 'ভিউমোডেল' পরিবর্তনশীলটি উল্লেখ করতে পারেন।
আমি এই পদ্ধতির পছন্দ করি কারণ এটি নিয়ামক যা লেআউটটিকে নিয়ন্ত্রণ করে, যখন পৃথক পৃষ্ঠার ভিডমোডালগুলি লেআউট অগ্নিস্টিক থাকে।
এমভিসি কোরের জন্য নোটস
IActionFilter
এবং ঠিক একই কাজটি করে OnActionExecuting
। আপনার MyActionFilter
উপর রাখুন MyController
।
public class MyActionFilter: Attribute, IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context)
{
}
public void OnActionExecuting(ActionExecutingContext context)
{
var myController= context.Controller as MyController;
if (myController!= null)
{
myController.Layout = new MainLayoutViewModel
{
};
myController.ViewBag.MainLayoutViewModel= myController.Layout;
}
}
}
এটি বেশ বেসিক স্টাফ, আপনাকে যা করতে হবে তা হ'ল বেস ভিউ মডেল তৈরি করা এবং সমস্ত নিশ্চিত করা! এবং আমি সব বোঝাতে চাই! আপনার মতামত যা কখনও সেই লেআউটটি ব্যবহার করে তা সেই মডেলটি ব্যবহার করে এমন মতামত গ্রহণ করবে!
public class SomeViewModel : ViewModelBase
{
public bool ImNotEmpty = true;
}
public class EmptyViewModel : ViewModelBase
{
}
public abstract class ViewModelBase
{
}
_লয়আউট.একএসটিএমএলে:
@model Models.ViewModelBase
<!DOCTYPE html>
<html>
and so on...
হোম নিয়ন্ত্রকের সূচক পদ্ধতিতে (উদাহরণস্বরূপ):
public ActionResult Index()
{
var model = new SomeViewModel()
{
};
return View(model);
}
সূচক
@model Models.SomeViewModel
@{
ViewBag.Title = "Title";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div class="row">
আমি একমত নই যে _লেআউটে একটি মডেল পাস করা একটি ত্রুটি, কিছু ব্যবহারকারীর তথ্য পাস করা যায় এবং ডেটাগুলি নিয়ন্ত্রণকারীদের উত্তরাধিকার শৃঙ্খলে পপুলেশন করা যায় তাই কেবলমাত্র একটি বাস্তবায়ন প্রয়োজন।
স্পষ্টতই আরও উন্নত উদ্দেশ্যে আপনার ইনজেকশন ব্যবহার করে কাস্টম স্ট্যাটিক কনটেক্সট তৈরি করা বিবেচনা করা উচিত এবং সেই মডেল নেমস্পেসটিকে _Layout.cshtml এ অন্তর্ভুক্ত করা উচিত।
তবে বেসিক ব্যবহারকারীদের জন্য এটি কৌশলটি করবে
একটি সাধারণ সমাধান হ'ল একটি বেস ভিউ মডেল তৈরি করা যাতে লেআউট ফাইলটিতে ব্যবহৃত বৈশিষ্ট্য থাকে এবং তারপরে বেস মডেল থেকে संबंधित পৃষ্ঠাগুলিতে ব্যবহৃত মডেলগুলির উত্তরাধিকারী হয়।
এই পদ্ধতির সমস্যাটি হ'ল আপনি এখন নিজেকে একটি মডেলের সমস্যার মধ্যে আটকে রেখেছেন কেবল অন্য শ্রেণীর কাছ থেকে উত্তরাধিকারী হতে পারে এবং সম্ভবত আপনার সমাধানটি এমন যে আপনি যেভাবে যে মডেলটিকে উদ্দেশ্য করেছিলেন তাতে উত্তরাধিকার ব্যবহার করতে পারবেন না।
আমার সমাধানটি বেস ভিউ মডেল দিয়ে শুরু হয়:
public class LayoutModel
{
public LayoutModel(string title)
{
Title = title;
}
public string Title { get;}
}
আমি তারপরে যা ব্যবহার করি তা হ'ল লেআউটমোডেলের একটি জেনেরিক সংস্করণ যা লেআউটমোডেল থেকে উত্তরাধিকার সূত্রে প্রাপ্ত:
public class LayoutModel<T> : LayoutModel
{
public LayoutModel(T pageModel, string title) : base(title)
{
PageModel = pageModel;
}
public T PageModel { get; }
}
এই সমাধানের সাথে আমি লেআউট মডেল এবং মডেলটির মধ্যে উত্তরাধিকার থাকার প্রয়োজনটি সংযোগ বিচ্ছিন্ন করে দিয়েছি।
সুতরাং এখন আমি এগিয়ে যেতে এবং লেআউটপ্যাশটিটিএমএলে লেআউটমোডেলটি এর মতো ব্যবহার করতে পারি:
@model LayoutModel
<!doctype html>
<html>
<head>
<title>@Model.Title</title>
</head>
<body>
@RenderBody()
</body>
</html>
এবং একটি পৃষ্ঠায় আপনি জেনেরিক লেআউটমোডেলটি এর মতো ব্যবহার করতে পারেন:
@model LayoutModel<Customer>
@{
var customer = Model.PageModel;
}
<p>Customer name: @customer.Name</p>
আপনার নিয়ন্ত্রক থেকে আপনি কেবলমাত্র লেআউটমোডেল টাইপের একটি মডেল ফিরে আসবেন:
public ActionResult Page()
{
return View(new LayoutModel<Customer>(new Customer() { Name = "Test" }, "Title");
}
আপনার নিজের নির্দিষ্ট নিয়ামককে আংশিক দৃশ্যে প্রয়োজনীয় মডেলটি পাস করার সাথে আপনি কেবল একটি নতুন আংশিক দৃশ্য যুক্ত করবেন না কেন এবং অবশেষে রেন্ডার পার্টিশিয়াল বা রেন্ডারঅ্যাকশন ব্যবহার করে আপনার লেআউট.এইচটিএমটিএলে উল্লিখিত আংশিক দৃশ্যটি রেন্ডার করবেন?
আমি লগইন হওয়া ব্যবহারকারীর তথ্য যেমন নাম, প্রোফাইল ছবি ইত্যাদি দেখানোর জন্য এই পদ্ধতিটি ব্যবহার করি
পুরানো প্রশ্ন তবে কেবলমাত্র এমভিসি 5 বিকাশকারীদের জন্য সমাধানটি উল্লেখ করার জন্য, আপনি Model
সম্পত্তিটি দেখুন হিসাবে ব্যবহার করতে পারেন ।
Model
উভয় দেখতে ও লেআউট সম্পত্তি একই সঙ্গে assosiated হয় ViewDataDictionary
যাতে আপনি বিন্যাস পৃষ্ঠায় আপনার মডেল পাস কোন অতিরিক্ত কাজ করতে হবে না, বস্তু, এবং আপনি ডিক্লেয়ার করতে হবে না @model MyModelName
লেআউট।
তবে লক্ষ্য করুন যে আপনি যখন @Model.XXX
বিন্যাসটিতে ব্যবহার করবেন তখন ইন্টেলিসেন্স প্রসঙ্গ মেনু উপস্থিত হবে না কারণ Model
এখানে যেমন একটি গতিশীল অবজেক্ট রয়েছে ViewBag
।
হতে পারে এটি প্রযুক্তিগতভাবে এটি পরিচালনা করার সঠিক উপায় নয় তবে আমার পক্ষে সবচেয়ে সহজ এবং সবচেয়ে যুক্তিসঙ্গত সমাধান হ'ল কেবল একটি শ্রেণি তৈরি করা এবং বিন্যাসে এটি ইনস্ট্যান্ট করা। এটি করা অন্যথায় সঠিক পদ্ধতিতে এটি এক সময়ের ব্যতিক্রম। যদি এটি বিন্যাসের চেয়ে বেশি করা হয় তবে আপনার প্রকল্পের আরও অগ্রগতি হওয়ার আগে আপনার কী করছে সে সম্পর্কে গুরুত্ব সহকারে আপনাকে পুনর্বিবেচনা করতে হবে এবং সম্ভবত আরও কয়েকটি টিউটোরিয়াল পড়তে হবে।
public class MyLayoutModel {
public User CurrentUser {
get {
.. get the current user ..
}
}
}
তারপর দেখুন
@{
// Or get if from your DI container
var myLayoutModel = new MyLayoutModel();
}
নেট কোর আপনি এমনকি এড়িয়ে যেতে পারেন এবং নির্ভরতা ইনজেকশন ব্যবহার করতে পারেন।
@inject My.Namespace.IMyLayoutModel myLayoutModel
এটি এমন একটি ক্ষেত্র যা একরকম ছায়াময়। তবে চূড়ান্ত জটিল বিকল্পগুলি আমি এখানে দেখতে পাচ্ছি, আমি মনে করি এটি ব্যবহারিকতার নামে করা ঠিক ব্যতিক্রমের চেয়ে বেশি। বিশেষত যদি আপনি এটি সরল রাখার বিষয়ে নিশ্চিত হন এবং কোনও ভারী যুক্তি (আমার পক্ষে যুক্তি দেওয়া হবে যে সেখানে আসলেই কিছু হওয়া উচিত নয়, তবে প্রয়োজনীয়তাগুলি পৃথক হতে পারে) অন্য শ্রেণি / স্তরে যেখানে এটি রয়েছে। মূলত কেবলমাত্র একটি দর্শনের জন্য আপনার সমস্ত নিয়ন্ত্রক বা মডেলকে দূষিত করার চেয়ে এটি অবশ্যই ভাল better
এটি সংরক্ষণাগারভুক্ত করার আরও একটি উপায় রয়েছে।
সমস্ত নিয়ন্ত্রকের জন্য কেবল বেসকন্ট্রোলার শ্রেণি প্রয়োগ করুন ।
ইন BaseController
বর্গ একটি পদ্ধতি যে উদাহরণস্বরূপ মত একটি মডেল বর্গ ফেরৎ তৈরি করুন।
public MenuPageModel GetTopMenu()
{
var m = new MenuPageModel();
// populate your model here
return m;
}
Layout
পৃষ্ঠাতে আপনি এই পদ্ধতিটি কল করতে পারেনGetTopMenu()
@using GJob.Controllers
<header class="header-wrapper border-bottom border-secondary">
<div class="sticky-header" id="appTopMenu">
@{
var menuPageModel = ((BaseController)this.ViewContext.Controller).GetTopMenu();
}
@Html.Partial("_TopMainMenu", menuPageModel)
</div>
</header>
আসুন ধরে নিই আপনার মডেলটি অবজেক্টগুলির একটি সংগ্রহ (বা সম্ভবত কোনও একক বস্তু)। মডেলের প্রতিটি বস্তুর জন্য নিম্নলিখিতটি করুন।
1) আপনি যে বস্তুটি প্রদর্শন করতে চান তা ভিউব্যাগে রাখুন। উদাহরণ স্বরূপ:
ViewBag.YourObject = yourObject;
২) _আউটআর.সি.এস.টি.এম.এল এর শীর্ষে একটি ব্যবহারের বিবৃতি যুক্ত করুন যা এতে আপনার অবজেক্টের জন্য শ্রেণি সংজ্ঞা রয়েছে। উদাহরণ স্বরূপ:
আপনার অ্যাপ্লিকেশন ব্যবহার করে
3) আপনি যখন নিজের অবজেক্টটিকে রেফারেন্স দিন _ লেআউট এ castালুন। আপনি যা করেছেন তার কারণে আপনি কাস্ট প্রয়োগ করতে পারেন (2)।
public interface IContainsMyModel
{
ViewModel Model { get; }
}
public class ViewModel : IContainsMyModel
{
public string MyProperty { set; get; }
public ViewModel Model { get { return this; } }
}
public class Composition : IContainsMyModel
{
public ViewModel ViewModel { get; set; }
}
আপনার বিন্যাসে আইকনটেনসমাইমোডেল ব্যবহার করুন।
সমাধান হয়েছে। ইন্টারফেস নিয়ম।
উদাহরণ স্বরূপ
@model IList<Model.User>
@{
Layout="~/Views/Shared/SiteLayout.cshtml";
}
নতুন @ মডেল নির্দেশিকা সম্পর্কে আরও পড়ুন