আমি এএসপি.এনইটি এমভিসিতে নতুন। ভিউমোডেলের উদ্দেশ্য বুঝতে আমার সমস্যা আছে।
একটি ভিউমোডেল কী এবং এএসপি.নেট এমভিসি অ্যাপ্লিকেশনটির জন্য আমাদের কেন ভিউমোডেল দরকার?
যদি আমি এর কার্যকারিতা এবং ব্যাখ্যা সম্পর্কে একটি ভাল উদাহরণ পাই তবে এটি আরও ভাল।
আমি এএসপি.এনইটি এমভিসিতে নতুন। ভিউমোডেলের উদ্দেশ্য বুঝতে আমার সমস্যা আছে।
একটি ভিউমোডেল কী এবং এএসপি.নেট এমভিসি অ্যাপ্লিকেশনটির জন্য আমাদের কেন ভিউমোডেল দরকার?
যদি আমি এর কার্যকারিতা এবং ব্যাখ্যা সম্পর্কে একটি ভাল উদাহরণ পাই তবে এটি আরও ভাল।
উত্তর:
একটি view model
আপনার ভিউ / পৃষ্ঠায় আপনি যে ডেটা প্রদর্শন করতে চান তা প্রতিনিধিত্ব করে, এটি স্ট্যাটিক পাঠ্যের জন্য ব্যবহার করা হোক বা ইনপুট মানগুলির জন্য (যেমন পাঠ্যবাক্সগুলি এবং ড্রপডাউন তালিকাগুলি) যা ডাটাবেসে যোগ করা যেতে পারে (বা সম্পাদিত)। এটি আপনার চেয়ে আলাদা কিছু domain model
। এটি দেখার জন্য একটি মডেল।
আমাদের বলুন যে আপনার একটি Employee
ক্লাস রয়েছে যা আপনার কর্মচারী ডোমেন মডেলকে উপস্থাপন করে এবং এতে নিম্নলিখিত বৈশিষ্ট্যগুলি রয়েছে (অনন্য সনাক্তকারী, প্রথম নাম, পদবি এবং তৈরি তারিখ):
public class Employee : IEntity
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateCreated { get; set; }
}
মডেলগুলিতে ডোমেন মডেলগুলি থেকে পৃথক হয়ে দেখুন দেখুন মডেলগুলিতে কেবলমাত্র আপনি আপনার ভিউতে ব্যবহার করতে চান এমন ডেটা (বৈশিষ্ট্য দ্বারা উপস্থাপিত) থাকে। উদাহরণস্বরূপ, বলুন যে আপনি কোনও নতুন কর্মচারী রেকর্ড যুক্ত করতে চান, আপনার ভিউ মডেলটি দেখতে দেখতে এটি দেখতে পারে:
public class CreateEmployeeViewModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
আপনি দেখতে পাচ্ছেন এটিতে কেবল দুটি বৈশিষ্ট্য রয়েছে। এই দুটি সম্পত্তিও কর্মচারী ডোমেন মডেলটিতে রয়েছে। আপনি কেন এটি জিজ্ঞাসা করতে পারেন? Id
দৃশ্য থেকে সেট করা নাও হতে পারে, এটি কর্মচারী টেবিল দ্বারা স্বয়ংক্রিয়ভাবে উত্পন্ন হতে পারে। এবং DateCreated
সঞ্চিত পদ্ধতিতে বা আপনার অ্যাপ্লিকেশনের পরিষেবা স্তরেও সেট করা যেতে পারে। সুতরাং Id
এবং DateCreated
ভিউ মডেলের প্রয়োজন হয় না। আপনি যখন কোনও কর্মীর বিশদ (ইতিমধ্যে ধরা পড়ে এমন কোনও কর্মচারী) স্থির পাঠ্য হিসাবে দেখেন তখন আপনি এই দুটি সম্পত্তি প্রদর্শন করতে চাইতে পারেন।
ভিউ / পৃষ্ঠাটি লোড করার সময়, আপনার কর্মচারী নিয়ন্ত্রকের মধ্যে ক্রিয়া ক্রিয়াকলাপটি এই দর্শন মডেলটির একটি উদাহরণ তৈরি করবে, প্রয়োজনে যে কোনও ক্ষেত্রকে পপুলেট করবে এবং তারপরে এই ভিউ মডেলটি ভিউ / পৃষ্ঠায় পাস করবে:
public class EmployeeController : Controller
{
private readonly IEmployeeService employeeService;
public EmployeeController(IEmployeeService employeeService)
{
this.employeeService = employeeService;
}
public ActionResult Create()
{
CreateEmployeeViewModel model = new CreateEmployeeViewModel();
return View(model);
}
public ActionResult Create(CreateEmployeeViewModel model)
{
// Do what ever needs to be done before adding the employee to the database
}
}
আপনার দর্শন / পৃষ্ঠাটি দেখতে দেখতে এইরকম হতে পারে (ধরে নিচ্ছেন আপনি ব্যবহার করছেন ASP.NET MVC
এবং Razor
ভিউ ইঞ্জিন):
@model MyProject.Web.ViewModels.CreateEmployeeViewModel
<table>
<tr>
<td><b>First Name:</b></td>
<td>@Html.TextBoxFor(m => m.FirstName, new { maxlength = "50", size = "50" })
@Html.ValidationMessageFor(m => m.FirstName)
</td>
</tr>
<tr>
<td><b>Last Name:</b></td>
<td>@Html.TextBoxFor(m => m.LastName, new { maxlength = "50", size = "50" })
@Html.ValidationMessageFor(m => m.LastName)
</td>
</tr>
</table>
বৈধকরণ এইভাবে শুধুমাত্র FirstName
এবং উপর করা হবে LastName
। ফ্লুয়েন্টভ্যালিডেশন ব্যবহার করে আপনার যেমন বৈধতা পেতে পারেন:
public class CreateEmployeeViewModelValidator : AbstractValidator<CreateEmployeeViewModel>
{
public CreateEmployeeViewModelValidator()
{
RuleFor(m => m.FirstName)
.NotEmpty()
.WithMessage("First name required")
.Length(1, 50)
.WithMessage("First name must not be greater than 50 characters");
RuleFor(m => m.LastName)
.NotEmpty()
.WithMessage("Last name required")
.Length(1, 50)
.WithMessage("Last name must not be greater than 50 characters");
}
}
এবং ডেটা টীকা সহ এটি এটিকে দেখতে পারে:
public class CreateEmployeeViewModel : ViewModelBase
{
[Display(Name = "First Name")]
[Required(ErrorMessage = "First name required")]
public string FirstName { get; set; }
[Display(Name = "Last Name")]
[Required(ErrorMessage = "Last name required")]
public string LastName { get; set; }
}
মনে রাখার মূল বিষয়টি হল ভিউ মডেলটি কেবলমাত্র সেই ডেটা উপস্থাপন করে যা আপনি ব্যবহার করতে চান , অন্য কিছু নয়। আপনার যদি 30 টি বৈশিষ্ট্যযুক্ত কোনও ডোমেন মডেল থাকে এবং আপনি কেবলমাত্র একটি একক মান আপডেট করতে চান তবে আপনি সমস্ত অপ্রয়োজনীয় কোড এবং বৈধতা কল্পনা করতে পারেন। এই দৃশ্যের পরিপ্রেক্ষিতে আপনার কাছে কেবলমাত্র ভিউ মডেলটিতে এই এক মান / সম্পত্তি থাকতে হবে এবং ডোমেন অবজেক্টে থাকা সমস্ত বৈশিষ্ট্য নেই।
একটি ভিউ মডেল কেবল একটি ডাটাবেস টেবিল থেকে তথ্য নাও থাকতে পারে। এটি অন্য সারণী থেকে ডেটা একত্রিত করতে পারে। নতুন কর্মচারী রেকর্ড যোগ করার বিষয়ে আমার উদাহরণটি নিন। কেবল প্রথম এবং শেষ নাম যুক্ত করার সাথে সাথে আপনি কর্মীর বিভাগ যুক্ত করতেও পারেন। বিভাগগুলির এই তালিকাটি আপনার Departments
টেবিল থেকে আসবে । সুতরাং এখন আপনার কাছে একটি ভিউ মডেলের টেবিল Employees
এবং Departments
সারণী থেকে ডেটা রয়েছে । আপনার ঠিক তখনই আপনার ভিউ মডেলটিতে নিম্নলিখিত দুটি বৈশিষ্ট্য যুক্ত করতে হবে এবং এটি ডেটা দিয়ে পপুলেট করতে হবে:
public int DepartmentId { get; set; }
public IEnumerable<Department> Departments { get; set; }
কর্মচারী ডেটা সম্পাদনা করার সময় (কোনও কর্মচারী যা ইতিমধ্যে ডাটাবেসে যুক্ত হয়ে গেছে) এটি আমার উপরের উদাহরণের চেয়ে অনেক বেশি পৃথক হবে না। একটি ভিউ মডেল তৈরি করুন, উদাহরণস্বরূপ এটি কল করুন EditEmployeeViewModel
। কেবলমাত্র প্রথম নাম এবং শেষ নামের মতো এই ভিউ মডেলটিতে আপনি যে ডেটাটি সম্পাদনা করতে চান তা কেবল আছে have ডেটা সম্পাদনা করুন এবং জমা দিন বোতামটি ক্লিক করুন। আমি Id
ক্ষেত্রটি সম্পর্কে খুব বেশি চিন্তা করব না কারণ Id
মানটি সম্ভবত URL টিতে থাকবে, উদাহরণস্বরূপ:
http://www.yourwebsite.com/Employee/Edit/3
এটি গ্রহণ করুন Id
এবং আপনার প্রথম নাম এবং পদবি নামের মানগুলির সাথে একত্রে এটি আপনার সংগ্রহস্থল স্তরে পাস করুন।
রেকর্ড মোছার সময়, আমি সাধারণত সম্পাদনা দর্শন মডেল হিসাবে একই পথ অনুসরণ করি। আমার একটি ইউআরএলও থাকবে, উদাহরণস্বরূপ:
http://www.yourwebsite.com/Employee/Delete/3
যখন প্রথমবারের জন্য ভিউটি লোড Id
হয়ে যায় তখন আমি 3 ব্যবহার করে ডাটাবেস থেকে কর্মীর ডেটা পেয়ে যাব I আমি কেবল তখন আমার ভিউ / পৃষ্ঠায় স্থির পাঠ্য প্রদর্শন করব যাতে ব্যবহারকারী দেখতে পাবে কোন কর্মচারী মুছে ফেলা হচ্ছে। যখন ব্যবহারকারী মুছুন বোতামটি ক্লিক করেন, আমি কেবলমাত্র Id
3 টির মানটি ব্যবহার করব এবং এটি আমার সংগ্রহস্থল স্তরে প্রেরণ করব। আপনার কেবল Id
সারণী থেকে কোনও রেকর্ড মুছতে হবে।
আরেকটি বিষয়, আপনার প্রতিটি ক্রিয়াটির জন্য সত্যই কোনও ভিউ মডেল লাগবে না। যদি এটি সাধারণ ডেটা হয় তবে এটি কেবলমাত্র ব্যবহার করা ভাল EmployeeViewModel
। যদি এটি জটিল দর্শন / পৃষ্ঠাগুলি হয় এবং সেগুলি একে অপরের থেকে পৃথক হয় তবে আমি আপনাকে প্রত্যেকটির জন্য পৃথক দর্শন মডেলগুলি ব্যবহার করার পরামর্শ দেব।
আমি আশা করি এটি দেখার মডেল এবং ডোমেন মডেল সম্পর্কে আপনার যে কোনও বিভ্রান্তি দূর করে।
ভিউ মডেল এমন একটি শ্রেণি যা নির্দিষ্ট ভিউতে ব্যবহৃত ডেটা মডেলকে উপস্থাপন করে। আমরা এই ক্লাসটি একটি লগইন পৃষ্ঠার মডেল হিসাবে ব্যবহার করতে পারি:
public class LoginPageVM
{
[Required(ErrorMessage = "Are you really trying to login without entering username?")]
[DisplayName("Username/e-mail")]
public string UserName { get; set; }
[Required(ErrorMessage = "Please enter password:)")]
[DisplayName("Password")]
public string Password { get; set; }
[DisplayName("Stay logged in when browser is closed")]
public bool RememberMe { get; set; }
}
এই ভিউ মডেলটি ব্যবহার করে আপনি দর্শনটি নির্ধারণ করতে পারবেন (রেজার ভিউ ইঞ্জিন):
@model CamelTrap.Models.ViewModels.LoginPageVM
@using (Html.BeginForm()) {
@Html.EditorFor(m => m);
<input type="submit" value="Save" class="submit" />
}
এবং ক্রিয়া:
[HttpGet]
public ActionResult LoginPage()
{
return View();
}
[HttpPost]
public ActionResult LoginPage(LoginPageVM model)
{
...code to login user to application...
return View(model);
}
যা এই ফলাফলটি তৈরি করে (বৈধতা বার্তাগুলি সহ ফর্ম জমা দেওয়ার পরে পর্দা নেওয়া হয়):
আপনি দেখতে পাচ্ছেন, একটি ভিউ মডেলের অনেক ভূমিকা রয়েছে:
LabelFor
, EditorFor
, DisplayFor
সাহায্যকারী)।একটি ভিউ মডেল এবং এর পুনরুদ্ধারের আরেকটি উদাহরণ: আমরা মৌলিক ব্যবহারকারীর ডেটা, তার সুবিধাগুলি এবং ব্যবহারকারীর নাম প্রদর্শন করতে চাই। আমরা একটি বিশেষ ভিউ মডেল তৈরি করি, যার মধ্যে কেবলমাত্র প্রয়োজনীয় ক্ষেত্র থাকে। আমরা ডাটাবেস থেকে বিভিন্ন সত্তা থেকে ডেটা উদ্ধার করি, তবে দৃশ্যটি কেবলমাত্র মডেল শ্রেণীর দর্শন সম্পর্কে সচেতন:
public class UserVM {
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public bool IsAdministrator { get; set; }
public string MothersName { get; set; }
}
আহরণ:
var user = db.userRepository.GetUser(id);
var model = new UserVM() {
ID = user.ID,
FirstName = user.FirstName,
LastName = user.LastName,
IsAdministrator = user.Proviledges.IsAdministrator,
MothersName = user.Mother.FirstName + " " + user.Mother.LastName
}
সম্পাদনা: আমি আমার ব্লগে এই উত্তরটি আপডেট করেছি:
http://www.samwheat.com/post/The-function-of-ViewModels-in-MVC-web-development
আমার উত্তরটি কিছুটা লম্বা তবে আমি মনে করি যে ভিউ মডেলগুলি অন্য ধরণের কেন ব্যবহৃত হয় এবং কেন প্রয়োজনীয় তা বোঝার জন্য সাধারণত ব্যবহৃত ব্যবহৃত মডেলের সাথে অন্য ধরণের তুলনা করা গুরুত্বপূর্ণ।
সংক্ষিপ্তকরণ এবং সরাসরি জিজ্ঞাসিত প্রশ্নের উত্তর দিতে:
সাধারণভাবে বলতে গেলে একটি ভিউ মডেল এমন একটি বস্তু যাতে ভিউ রেন্ডার করার জন্য প্রয়োজনীয় সমস্ত বৈশিষ্ট্য এবং পদ্ধতি থাকে। মডেল বৈশিষ্ট্যগুলি প্রায়শই গ্রাহক এবং অর্ডারগুলির মতো ডেটা অবজেক্টগুলির সাথে সম্পর্কিত হয় এবং এর সাথে সাথে পৃষ্ঠা বা অ্যাপ্লিকেশন সম্পর্কিত নিজস্ব ব্যবহারকারীর নাম যেমন ব্যবহারকারীর নাম, অ্যাপ্লিকেশন নাম ইত্যাদি থাকে মডেলগুলি কোনও রেন্ডারিং ইঞ্জিনে পাস করার জন্য একটি সুবিধাজনক অবজেক্ট সরবরাহ করে এইচটিএমএল পৃষ্ঠা তৈরি করুন। একটি ভিউ মডেল ব্যবহার করার অনেকগুলি কারণ হ'ল ভিউ মডেলগুলি কিছু নির্দিষ্ট উপস্থাপনা কাজগুলির ইউনিট পরীক্ষার একটি উপায় সরবরাহ করে যেমন ব্যবহারকারীর ইনপুট পরিচালনা করা, ডেটা যাচাই করা, প্রদর্শনের জন্য ডেটা পুনরুদ্ধার করা ইত্যাদি test
এখানে সত্তা মডেলগুলির একটি তুলনা করা হয়েছে (a.ka. DTO এর a.ka. মডেল), উপস্থাপনা মডেল এবং দেখুন মডেল।
ডেটা স্থানান্তর অবজেক্টস ওরফে "মডেল"
ডেটা ট্রান্সফার অবজেক্ট (ডিটিও) হ'ল এমন একটি শ্রেণি যা বৈশিষ্ট্যগুলি একটি ডেটাবেজে একটি টেবিল স্কিমার সাথে মেলে। ডিটিও'র ডেটা স্টোর থেকে এবং ডেটা থেকে শাটলিংয়ের জন্য তাদের সাধারণ ব্যবহারের জন্য নামকরণ করা হয়েছে।
ডিটিও'র বৈশিষ্ট্য:
Business ব্যবসায়ের জিনিস - তাদের সংজ্ঞা প্রয়োগের ডেটার উপর নির্ভরশীল।
। সাধারণত বৈশিষ্ট্যগুলি থাকে - কোনও কোড নেই।
• প্রধানত একটি ডেটাবেস থেকে এবং ডেটা পরিবহনের জন্য ব্যবহৃত হয়।
Data ডেটা স্টোরের নির্দিষ্ট টেবিলের ক্ষেত্রগুলিতে সঠিকভাবে বা ঘনিষ্ঠভাবে মিল match
ডেটাবেস টেবিলগুলি সাধারণত নরমাল করা হয় তাই ডিটিও'র সাধারণত স্বাভাবিক থাকে। এটি তাদের উপাত্ত উপস্থাপনের জন্য সীমিত ব্যবহার করে। তবে কিছু সাধারণ ডেটা স্ট্রাকচারের জন্য তারা প্রায়শই বেশ ভাল করে।
ডিটিওর মতো দেখতে কী হতে পারে তার দুটি উদাহরণ এখানে রয়েছে:
public class Customer
{
public int ID { get; set; }
public string CustomerName { get; set; }
}
public class Order
{
public int ID { get; set; }
public int CustomerID { get; set; }
public DateTime OrderDate { get; set; }
public Decimal OrderAmount { get; set; }
}
উপস্থাপনা মডেল
একটি উপস্থাপনা মডেল একটি ইউটিলিটি ক্লাস যা কোনও স্ক্রিন বা রিপোর্টে ডেটা রেন্ডার করতে ব্যবহৃত হয়। উপস্থাপনা মডেলগুলি সাধারণত জটিল ডেটা স্ট্রাকচারগুলি মডেল করতে ব্যবহৃত হয় যা একাধিক ডিটিওর ডেটা থেকে তৈরি। উপস্থাপনা মডেল প্রায়শই ডেটা একটি অস্বীকৃত দৃশ্য উপস্থাপন।
উপস্থাপনা মডেলগুলির বৈশিষ্ট্য:
Business ব্যবসায়ের জিনিস - তাদের সংজ্ঞা প্রয়োগের ডেটার উপর নির্ভরশীল।
Mostly বেশিরভাগ বৈশিষ্ট্য ধারণ করে। কোড সাধারণত ডেটা ফর্ম্যাট করতে বা কোনও ডিটিওতে রূপান্তর করতে সীমাবদ্ধ। উপস্থাপনা মডেলগুলিতে ব্যবসায়ের যুক্তি থাকা উচিত নয়।
• প্রায়শই ডেটাগুলির একটি অস্বীকৃত দৃশ্য উপস্থাপন করুন। এটি হ'ল তারা একাধিক ডিটিও'র বৈশিষ্ট্যগুলি একত্রিত করে।
• প্রায়শই একটি ডিটিওর চেয়ে পৃথক বেস ধরণের বৈশিষ্ট্য থাকে। উদাহরণস্বরূপ ডলারের পরিমাণগুলি স্ট্রিং হিসাবে উপস্থাপিত হতে পারে যাতে সেগুলিতে কমা এবং একটি মুদ্রার চিহ্ন থাকতে পারে।
• প্রায়শই কীভাবে তারা ব্যবহৃত হয় সেই সাথে তাদের বস্তুর বৈশিষ্ট্যগুলিও দ্বারা সংজ্ঞায়িত করা হয়। অন্য কথায়, একটি সাধারণ ডিটিও যা গ্রিড সরবরাহের জন্য ব্যাকিং মডেল হিসাবে ব্যবহৃত হয় বাস্তবে সেই গ্রিডের প্রসঙ্গে একটি উপস্থাপনা মডেলও হয়।
উপস্থাপনা মডেলগুলি "প্রয়োজন হিসাবে" এবং "যেখানে প্রয়োজন" ব্যবহার করা হয় (যেখানে ডিটিও'র সাধারণত ডাটাবেস স্কিমার সাথে আবদ্ধ থাকে)। একটি উপস্থাপনা মডেল পুরো পৃষ্ঠার জন্য কোনও পৃষ্ঠার গ্রিড, বা কোনও গ্রিডে একটি ড্রপডাউন পুরো পৃষ্ঠার জন্য ডেটা মডেল করতে ব্যবহৃত হতে পারে। উপস্থাপনা মডেলগুলিতে প্রায়শই এমন বৈশিষ্ট্য থাকে যা অন্যান্য উপস্থাপনা মডেল। উপস্থাপনা মডেলগুলি প্রায়শই একক-ব্যবহারের উদ্দেশ্যে যেমন একটি একক পৃষ্ঠায় একটি নির্দিষ্ট গ্রিড রেন্ডার করার জন্য নির্মিত হয়।
একটি উদাহরণ উপস্থাপনা মডেল:
public class PresentationOrder
{
public int OrderID { get; set; }
public DateTime OrderDate { get; set; }
public string PrettyDate { get { return OrderDate.ToShortDateString(); } }
public string CustomerName { get; set; }
public Decimal OrderAmount { get; set; }
public string PrettyAmount { get { return string.Format("{0:C}", OrderAmount); } }
}
মডেলগুলি দেখুন
একটি ভিউ মডেল একটি উপস্থাপনা মডেলের অনুরূপ যা ভিউ রেন্ডার করার জন্য একটি ব্যাকিং ক্লাস। তবে এটি কীভাবে তৈরি করা হয় তা উপস্থাপনা মডেল বা একটি ডিটিওর থেকে একেবারেই আলাদা। মডেলগুলি প্রায়শই উপস্থাপনা মডেল এবং ডিটিও'র সমান বৈশিষ্ট্য ধারণ করে এবং এই কারণে তারা প্রায়শই অন্যটির জন্য একটি বিভ্রান্ত হয়।
মডেলগুলির বৈশিষ্ট্য:
Page কোনও পৃষ্ঠা বা স্ক্রিন রেন্ডার করতে ডেটা ব্যবহারের একক উত্স? সাধারণত এর অর্থ হ'ল ভিউ মডেল এমন প্রতিটি সম্পত্তি প্রকাশ করে যা পৃষ্ঠার যে কোনও নিয়ন্ত্রণের জন্য নিজেকে সঠিকভাবে রেন্ডার করা দরকার। ভিউ মডেলটিকে দেখার জন্য একক উপাত্তের উত্স তৈরি করা তার ইউনিট পরীক্ষার জন্য তার ক্ষমতা এবং মানকে ব্যাপকভাবে উন্নত করে।
Comp সম্মিলিত বস্তু যে বৈশিষ্ট্য যে অ্যাপ্লিকেশন ডেটা সেইসাথে বৈশিষ্ট্য যে আবেদন কোড দ্বারা ব্যবহৃত হয় গঠিত ধারণ করে। পুনরায় ব্যবহারযোগ্যতার জন্য ভিউ মডেলটি ডিজাইন করার সময় এই বৈশিষ্ট্যটি গুরুত্বপূর্ণ এবং নীচের উদাহরণগুলিতে আলোচনা করা হয়েছে।
Application অ্যাপ্লিকেশন কোড ধারণ করে। মডেলগুলিতে দেখুন সাধারণত এমন পদ্ধতি থাকে যা রেন্ডারিংয়ের সময় ডাকা হয় এবং যখন ব্যবহারকারী পৃষ্ঠার সাথে ইন্টারঅ্যাক্ট করে। এই কোডটি সাধারণত ইভেন্ট হ্যান্ডলিং, অ্যানিমেশন, নিয়ন্ত্রণের দৃশ্যমানতা, স্টাইলিং ইত্যাদির সাথে সম্পর্কিত tes
Code এমন ডেটা রয়েছে যা ব্যবসায়িক পরিষেবাগুলিতে ডেটা পুনরুদ্ধার করার জন্য বা এটি একটি ডেটাবেস সার্ভারে প্রেরণের উদ্দেশ্যে কল করে। এই কোডটি প্রায়শই ভুলভাবে একটি নিয়ামকের মধ্যে রাখা হয়। নিয়ামক থেকে ব্যবসায় পরিষেবাগুলিতে কল করা ইউনিট পরীক্ষার জন্য ভিউ মডেলের উপযোগিতা সীমাবদ্ধ করে। পরিষ্কার হওয়ার জন্য, দেখুন মডেলগুলি নিজেরাই ব্যবসায়ের যুক্তিযুক্ত না হওয়া উচিত তবে সেই পরিষেবাগুলিতে কল করা উচিত যা ব্যবসায় যুক্তিযুক্ত।
• প্রায়শই এমন বৈশিষ্ট্য থাকে যা অন্যান্য পৃষ্ঠাগুলি বা স্ক্রিনগুলির জন্য অন্যান্য দর্শন মডেল।
“" প্রতি পৃষ্ঠায় "বা" প্রতি পর্দা "লেখা আছে। একটি অনন্য ভিউ মডেল সাধারণত প্রতিটি অ্যাপ্লিকেশনের প্রতিটি পৃষ্ঠা বা স্ক্রিনের জন্য লেখা হয়।
Most বেশিরভাগ পৃষ্ঠাগুলি এবং স্ক্রিনগুলি সাধারণ বৈশিষ্ট্যগুলি ভাগ করে রাখার কারণে সাধারণত একটি বেস শ্রেণি থেকে নেওয়া।
মডেল রচনা দেখুন
যেমন আগেই বলা হয়েছে, ভিউ মডেলগুলি সম্মিলিত বস্তু যা তারা একক বস্তুর মধ্যে অ্যাপ্লিকেশন বৈশিষ্ট্য এবং ব্যবসায়িক ডেটা বৈশিষ্ট্যগুলিকে একত্রিত করে। ভিউ মডেলগুলিতে ব্যবহৃত সাধারণভাবে ব্যবহৃত অ্যাপ্লিকেশন বৈশিষ্ট্যের উদাহরণগুলি:
Application অ্যাপ্লিকেশন রাষ্ট্র যেমন ত্রুটি বার্তা, ব্যবহারকারীর নাম, স্থিতি ইত্যাদি প্রদর্শন করতে ব্যবহৃত হয় এমন বৈশিষ্ট্য ties
Format বৈশিষ্ট্যগুলি বিন্যাস, প্রদর্শন, স্টাইলাইজ বা নিয়ন্ত্রণ সঞ্চার করতে ব্যবহৃত হয়।
Data ডেটা বাইন্ডিংয়ের জন্য ব্যবহৃত বৈশিষ্ট্য যেমন তালিকার অবজেক্টস এবং বৈশিষ্ট্যগুলি যা ব্যবহারকারীর দ্বারা ইনপুট হয় মধ্যবর্তী ডেটা রাখে।
নিম্নলিখিত উদাহরণগুলি দেখায় কেন ভিউ মডেলগুলির সম্মিলিত প্রকৃতি গুরুত্বপূর্ণ এবং আমরা কীভাবে দক্ষ এবং পুনরায় ব্যবহারযোগ্য এমন একটি ভিউ মডেল তৈরি করতে পারি।
ধরুন আমরা একটি ওয়েব অ্যাপ্লিকেশন লিখছি। অ্যাপ্লিকেশন ডিজাইনের একটি প্রয়োজনীয়তা হ'ল প্রতিটি পৃষ্ঠায় পৃষ্ঠার শিরোনাম, ব্যবহারকারীর নাম এবং অ্যাপ্লিকেশন নামটি প্রদর্শিত হবে। যদি আমরা উপস্থাপনা অর্ডার অবজেক্টটি প্রদর্শনের জন্য একটি পৃষ্ঠা তৈরি করতে চাই, তবে আমরা উপস্থাপনা মডেলটি নিম্নরূপে সংশোধন করতে পারি:
public class PresentationOrder
{
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
public int OrderID { get; set; }
public DateTime OrderDate { get; set; }
public string PrettyDate { get { return OrderDate.ToShortDateString(); } }
public string CustomerName { get; set; }
public Decimal OrderAmount { get; set; }
public string PrettyAmount { get { return string.Format("{0:C}", OrderAmount); } }
}
এই নকশাটি কার্যকর হতে পারে ... তবে যদি আমরা একটি পৃষ্ঠা তৈরি করতে চাই যা আদেশের একটি তালিকা প্রদর্শন করবে? পেজটাইটেল, ইউজারনেম এবং অ্যাপ্লিকেশননাম বৈশিষ্ট্যগুলি পুনরাবৃত্তি হবে এবং এটি দিয়ে কাজ করার জন্য অকার্যকর হয়ে যাবে। এছাড়াও, যদি আমরা শ্রেণীর নির্মাতায় কিছু পৃষ্ঠার স্তরের যুক্তি সংজ্ঞায়িত করতে চাই? আমরা প্রদর্শিত প্রতিটি আদেশের জন্য কোনও উদাহরণ তৈরি করলে আমরা তা আর করতে পারি না।
উত্তরাধিকার উপর রচনা
এখানে অর্ডার উপস্থাপনা মডেলটিকে আমরা পুনরায় ফ্যাক্টর করতে পারি যে এটি সত্য ভিউ মডেল হয়ে যায় এবং এটি একটি একক উপস্থাপনা অর্ডার অবজেক্ট বা প্রেজেন্টেশন অর্ডার অবজেক্টের সংকলন প্রদর্শনের জন্য কার্যকর হবে:
public class PresentationOrderVM
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
// Business properties
public PresentationOrder Order { get; set; }
}
public class PresentationOrderVM
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
// Business properties
public List<PresentationOrder> Orders { get; set; }
}
উপরোক্ত দুটি শ্রেণীর দিকে তাকিয়ে আমরা দেখতে পাচ্ছি যে ভিউ মডেল সম্পর্কে চিন্তা করার এক উপায় হ'ল এটি একটি উপস্থাপনা মডেল যা সম্পত্তি হিসাবে অন্য একটি উপস্থাপনা মডেল রাখে। শীর্ষ স্তরের উপস্থাপনা মডেল (অর্থাত্ মডেল দেখুন) পৃষ্ঠা বা অ্যাপ্লিকেশন সম্পর্কিত যখন প্রেজেন্টেশন মডেল (সম্পত্তি) অ্যাপ্লিকেশন ডেটার সাথে প্রাসঙ্গিক বৈশিষ্ট্যযুক্ত বৈশিষ্ট্য ধারণ করে।
আমরা আমাদের ডিজাইনটি আরও একধাপ এগিয়ে নিয়ে যেতে এবং একটি বেস ভিউ মডেল ক্লাস তৈরি করতে পারি যা কেবল উপস্থাপনা অর্ডারদের জন্যই নয়, অন্য কোনও শ্রেণীর জন্যও ব্যবহার করা যেতে পারে:
public class BaseViewModel
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
}
এখন আমরা আমাদের প্রেজেন্টেশন অর্ডারভিএম এর মতো সহজ করতে পারি:
public class PresentationOrderVM : BaseViewModel
{
// Business properties
public PresentationOrder Order { get; set; }
}
public class PresentationOrderVM : BaseViewModel
{
// Business properties
public List<PresentationOrder> Orders { get; set; }
}
আমরা আমাদের বেসভিউমোডেলটিকে জেনেরিক করে আরও বেশি ব্যবহারযোগ্য করে তুলতে পারি:
public class BaseViewModel<T>
{
// Application properties
public string PageTitle { get; set; }
public string UserName { get; set; }
public string ApplicationName { get; set; }
// Business property
public T BusinessObject { get; set; }
}
এখন আমাদের বাস্তবায়ন অনায়াস:
public class PresentationOrderVM : BaseViewModel<PresentationOrder>
{
// done!
}
public class PresentationOrderVM : BaseViewModel<List<PresentationOrder>>
{
// done!
}
MyViewModel<MyPresModel>
আপনার যদি ভিউ সম্পর্কিত নির্দিষ্ট সম্পত্তি রয়েছে এবং আপনি ডিবি / পরিষেবা / ডেটা স্টোরের সাথে সম্পর্কিত না হন তবে ভিউমোডেলগুলি ব্যবহার করা ভাল অভ্যাস। বলুন, আপনি একটি ডিবি ক্ষেত্রের (বা দুটি) ভিত্তিতে নির্বাচিত একটি চেকবাক্স ছেড়ে যেতে চান তবে ডিবি ক্ষেত্রটি নিজেই বুলিয়ান নয়। যদিও এই বৈশিষ্ট্যগুলি নিজেই মডেলটিতে তৈরি করা এবং এটি ডেটার বাইন্ডিং থেকে গোপন রাখা সম্ভব হয়, আপনি এই জাতীয় ক্ষেত্র এবং লেনদেনের পরিমাণের উপর নির্ভর করে মডেলকে বিশৃঙ্খলা করতে নাও চান।
যদি খুব কম ভিউ-নির্দিষ্ট ডেটা এবং / বা ট্রান্সফরমেশন থাকে তবে আপনি নিজেই মডেলটি ব্যবহার করতে পারেন
আমি সমস্ত পোস্ট পড়িনি তবে প্রতিটি উত্তরে এমন একটি ধারণা অনুপস্থিত মনে হচ্ছে যা সত্যই আমাকে "এটি পেতে" সাহায্য করেছিল ...
যদি কোনও মডেল কোনও ডাটাবেস সারণির অনুরূপ হয় , তবে একটি ভিউমোডেল একটি ডাটাবেস ভিউয়ের অনুরূপ - একটি ভিউ সাধারণত একটি টেবিল থেকে অল্প পরিমাণে ডেটা, বা একাধিক টেবিল (যোগ দেয়) থেকে জটিল সেটগুলির ডেটা দেয়।
আমি ভিউমোডেলগুলি ব্যবহার করে একটি ভিউ / ফর্মের তথ্য প্রেরণে ব্যবহার করি এবং ফর্মটি যখন নিয়ন্ত্রকের কাছে ফিরে আসে তখন সেই তথ্যটি একটি বৈধ মডেল হিসাবে স্থানান্তরিত করে - তালিকাগুলি (আইনিউনামেবল) সংরক্ষণ করার জন্য খুব কার্যকর।
এমভিসির একটি ভিউ মডেল নেই: এটির একটি মডেল, ভিউ এবং নিয়ামক রয়েছে। একটি ভিউ মডেল এমভিভিএম (মডেল-ভিউ-ভিউ মডেল) এর অংশ part এমভিভিএম উপস্থাপনা মডেল থেকে প্রাপ্ত এবং ডাব্লুপিএফ-তে জনপ্রিয় হয়েছে is এমভিভিএম-তে একটি মডেলও থাকতে হবে তবে বেশিরভাগ লোকেরা সেই প্যাটার্নটির বিন্দুটি পুরোপুরি মিস করে এবং তাদের কেবল একটি ভিউ এবং একটি ভিউ মডেল থাকবে। এমভিসির মডেলগুলি এমভিভিএমের মডেলের অনুরূপ।
এমভিসিতে প্রক্রিয়াটি 3 টি বিভিন্ন দায়িত্বে বিভক্ত:
এমভিসি ওয়েব অ্যাপ্লিকেশনগুলির জন্য খুব উপযুক্ত নয়। এটি ডেস্কটপ অ্যাপ্লিকেশন তৈরির জন্য স্মলটালক দ্বারা প্রবর্তিত একটি প্যাটার্ন। একটি ওয়েব পরিবেশ সম্পূর্ণ ভিন্ন আচরণ করে। ডেস্কটপ বিকাশ থেকে 40 বছরের পুরানো ধারণাটি অনুলিপি করা এবং এটি একটি ওয়েব এনভায়রনমেন্টে আটকানো বেশি অর্থবোধ করে না। তবে অনেক লোক মনে করেন এটি ঠিক আছে, কারণ তাদের অ্যাপ্লিকেশনটি সঠিক মানগুলি সংকলন করে এবং প্রদান করে। এটি, আমার মতে, নির্দিষ্ট নকশার পছন্দটি ঠিক হিসাবে ঘোষণা করার পক্ষে যথেষ্ট নয়।
ওয়েব অ্যাপ্লিকেশনটির একটি মডেলের উদাহরণ হতে পারে:
public class LoginModel
{
private readonly AuthenticationService authentication;
public LoginModel(AuthenticationService authentication)
{
this.authentication = authentication;
}
public bool Login()
{
return authentication.Login(Username, Password);
}
public string Username { get; set; }
public string Password { get; set; }
}
নিয়ামক এটি এটি ব্যবহার করতে পারেন:
public class LoginController
{
[HttpPost]
public ActionResult Login(LoginModel model)
{
bool success = model.Login();
if (success)
{
return new RedirectResult("/dashboard");
}
else
{
TempData["message"] = "Invalid username and/or password";
return new RedirectResult("/login");
}
}
}
আপনার নিয়ামক পদ্ধতি এবং আপনার মডেলগুলি ছোট, সহজে পরীক্ষামূলক এবং বিন্দুতে হবে।
মডেল দেখুন একটি সাধারণ শ্রেণি যা একাধিক শ্রেণীর সম্পত্তি থাকতে পারে। আমরা এটি প্রয়োজনীয় সমস্ত বৈশিষ্ট্য উত্তরাধিকারী করার জন্য ব্যবহার করি, যেমন আমার কাছে শিক্ষার্থী এবং বিষয় দুটি শ্রেণি রয়েছে
Public class Student
{
public int Id {get; set;}
public string Name {get; set;}
}
Public class Subject
{
public int SubjectID {get; set;}
public string SubjectName {get; set;}
}
এখন আমরা রেকর্ডস শিক্ষার্থীর নাম এবং সাবজেক্টের নাম ভিউতে (এমভিসিতে) প্রদর্শন করতে চাই, তবে একের বেশি ক্লাস যুক্ত করা যেমন সম্ভব নয়:
@model ProjectName.Model.Student
@model ProjectName.Model.Subject
উপরের কোডটি একটি ত্রুটি ছুঁড়ে দেবে ...
এখন আমরা একটি শ্রেণি তৈরি করি এবং এটিকে কোনও নাম দিতে পারি, তবে "জাইভিউমোডেল" এই ফর্ম্যাটটি এটি বুঝতে সহজ করে তুলবে। এটি উত্তরাধিকার ধারণা। এখন আমরা নিম্নলিখিত নামের সাথে একটি তৃতীয় শ্রেণি তৈরি করি:
public class StudentViewModel:Subject
{
public int ID {get; set;}
public string Name {get; set;}
}
এখন আমরা এই ভিউমোডেলটি ভিউতে ব্যবহার করি
@ মডেল প্রজেক্টনাম.মোডেল.স্টুডেন্টভিউ মডেল
এখন আমরা স্টুডভিউমোডেলের সমস্ত সম্পত্তি এবং ভিউতে উত্তরাধিকারসূত্রে প্রাপ্ত ক্লাসে অ্যাক্সেস করতে সক্ষম।
অনেক বড় উদাহরণ, আমাকে পরিষ্কার এবং খাস্তা উপায়ে ব্যাখ্যা করি।
ভিউমোডেল = মডেল যা দর্শনের জন্য তৈরি করা হয়।
এএসপি.এনইটি এমভিসি ভিউতে একাধিক মডেল থাকতে পারে না তাই আমাদের যদি একাধিক মডেলের ভিউতে বৈশিষ্ট্য প্রদর্শন করতে হয় তবে এটি সম্ভব নয়। ভিউমোডেল এই উদ্দেশ্যে কাজ করে।
ভিউ মডেল এমন একটি মডেল শ্রেণি যা দেখার জন্য প্রয়োজনীয় কেবলমাত্র সেই বৈশিষ্ট্যগুলি ধারণ করতে পারে। এটিতে ডাটাবেসের একাধিক সত্তা (সারণী) থেকে থাকা বৈশিষ্ট্যও থাকতে পারে। নাম অনুসারে, এই মডেলটি দেখার প্রয়োজনীয়তার জন্য সুনির্দিষ্টভাবে তৈরি করা হয়েছে।
মডেলগুলির কয়েকটি উদাহরণ নীচে রয়েছে
ভিউমোডেলটি একাধিক সত্তায় রেকর্ড সন্নিবেশ করতে, আপডেট করতে ব্যবহার করা যেতে পারে তবে ভিউমোডেলের মূল ব্যবহারটি একক দৃশ্যে একাধিক সত্তা (মডেল) থেকে কলাম প্রদর্শন করা।
ভিউমোডেল তৈরির পদ্ধতিটি মডেল তৈরির মতোই, ভিউমোডেলের জন্য ভিউ তৈরির পদ্ধতিও মডেলের জন্য ভিউ তৈরির মতো।
এখানে ভিউমোডেল ব্যবহার করে তালিকার ডেটার একটি ছোট উদাহরণ রয়েছে ।
আশা করি এটি কার্যকর হবে।
ভিউমোডেল এমন একতরফা কাজ যা এমভিসির কাঠামোর ধারণাগত আচ্ছন্নতাকে প্যাচ করে। এটি 3-স্তর মডেল-ভিউ-কন্ট্রোলার আর্কিটেকচারের 4 র্থ স্তর উপস্থাপন করে। যখন মডেলের (ডোমেন মডেল) উপযুক্ত না হয়, খুব বড় (২-৩ টির চেয়ে বড় ক্ষেত্র) ভিউয়ের জন্য হয়, তখন আমরা এটিকে ভিউতে পাস করার জন্য আরও ছোট ভিডমডেল তৈরি করি।
একটি ভিউ মডেল তথ্যগুলির একটি ধারণাগত মডেল। উদাহরণস্বরূপ এর ব্যবহারটি হয় হয় কোনও উপসেট পাবেন বা বিভিন্ন টেবিল থেকে ডেটা একত্রিত করুন।
আপনি কেবল নির্দিষ্ট বৈশিষ্ট্যই পেতে চাইতে পারেন, সুতরাং এটি আপনাকে কেবলমাত্র সেইগুলি লোড করার অনুমতি দেয় এবং অতিরিক্ত সংযোজনীয় বৈশিষ্ট্যগুলি নয়
ভিউমোডেল ডিজাইন করা
public class UserLoginViewModel
{
[Required(ErrorMessage = "Please enter your username")]
[Display(Name = "User Name")]
[MaxLength(50)]
public string UserName { get; set; }
[Required(ErrorMessage = "Please enter your password")]
[Display(Name = "Password")]
[MaxLength(50)]
public string Password { get; set; }
}
ভিউতে মডেলটি উপস্থাপন করা হচ্ছে
@model MyModels.UserLoginViewModel
@{
ViewBag.Title = "User Login";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm())
{
<div class="editor-label">
@Html.LabelFor(m => m.UserName)
</div>
<div class="editor-field">
@Html.TextBoxFor(m => m.UserName)
@Html.ValidationMessageFor(m => m.UserName)
</div>
<div class="editor-label">
@Html.LabelFor(m => m.Password)
</div>
<div class="editor-field">
@Html.PasswordFor(m => m.Password)
@Html.ValidationMessageFor(m => m.Password)
</div>
<p>
<input type="submit" value="Log In" />
</p>
</div>
}
অ্যাকশন নিয়ে কাজ করা
public ActionResult Login()
{
return View();
}
[HttpPost]
public ActionResult Login(UserLoginViewModel user)
{
// To acces data using LINQ
DataClassesDataContext mobjentity = new DataClassesDataContext();
if (ModelState.IsValid)
{
try
{
var q = mobjentity.tblUsers.Where(m => m.UserName == user.UserName && m.Password == user.Password).ToList();
if (q.Count > 0)
{
return RedirectToAction("MyAccount");
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
catch (Exception ex)
{
}
}
return View(user);
}
ভিউ মডেল এমন একটি শ্রেণি যা আমরা ভিউতে ডেটা উপস্থাপনের জন্য ব্যবহার করতে পারি। ধরুন আপনার দুটি সত্তা স্থান এবং প্লেস ক্যাটাগরি রয়েছে এবং আপনি একটি একক মডেল ব্যবহার করে উভয় সত্তা থেকে ডেটা অ্যাক্সেস করতে চান তবে আমরা ভিউমোডেল ব্যবহার করি।
public class Place
{
public int PlaceId { get; set; }
public string PlaceName { get; set; }
public string Latitude { get; set; }
public string Longitude { get; set; }
public string BestTime { get; set; }
}
public class Category
{
public int ID { get; set; }
public int? PlaceId { get; set; }
public string PlaceCategoryName { get; set; }
public string PlaceCategoryType { get; set; }
}
public class PlaceCategoryviewModel
{
public string PlaceName { get; set; }
public string BestTime { get; set; }
public string PlaceCategoryName { get; set; }
public string PlaceCategoryType { get; set; }
}
সুতরাং উপরের উদাহরণে স্থান এবং বিভাগ দুটি পৃথক সত্তা এবং প্লেস ক্যাটাগরির ভিউ মডেলটি ভিউমোডেল যা আমরা ভিউতে ব্যবহার করতে পারি।
আপনি যদি ভিউমোডেলসের সাথে "বেসলাইন" ওয়েব অ্যাপ্লিকেশন সেটআপ করবেন কীভাবে কোডটি অধ্যয়ন করতে চান আমি এই কোডটি গিটহাবটিতে ডাউনলোড করতে পরামর্শ দিতে পারি: https://github.com/ajsaulsberry/BlipAjax । আমি বড় এন্টারপ্রাইজ অ্যাপ্লিকেশন বিকাশ করেছি। আপনি যখন কোনও ভাল আর্কিটেকচার সেটআপ করতে সমস্যাযুক্ত হন যা এই সমস্ত "ভিউমোডেল" কার্যকারিতা পরিচালনা করে। আমি মনে করি ব্লিপএজ্যাক্স দিয়ে আপনার খুব ভাল "বেসলাইন" শুরু হবে। এটি কেবল একটি সাধারণ ওয়েবসাইট, তবে এর সরলতায় দুর্দান্ত। অ্যাপ্লিকেশনটিতে আসলে কী প্রয়োজন তা নির্দেশ করার জন্য তারা ইংরাজী ভাষাটি যেভাবে ব্যবহার করেছিল তা আমি পছন্দ করি।