এমভিসিতে ভিউমোডেল কী?


429

আমি এএসপি.এনইটি এমভিসিতে নতুন। ভিউমোডেলের উদ্দেশ্য বুঝতে আমার সমস্যা আছে।

একটি ভিউমোডেল কী এবং এএসপি.নেট এমভিসি অ্যাপ্লিকেশনটির জন্য আমাদের কেন ভিউমোডেল দরকার?

যদি আমি এর কার্যকারিতা এবং ব্যাখ্যা সম্পর্কে একটি ভাল উদাহরণ পাই তবে এটি আরও ভাল।


4
এই পোস্টটি আপনি যা খুঁজছেন - "একটি এএসপি। নেট এমভিসি ভিউমোডেল কী?"
ইউসুবভ

6
এই নিবন্ধটি দুর্দান্ত দেখাচ্ছে: rachelappel.com/…
অ্যান্ড্রু

উত্তর:


607

একটি 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 আমি কেবল তখন আমার ভিউ / পৃষ্ঠায় স্থির পাঠ্য প্রদর্শন করব যাতে ব্যবহারকারী দেখতে পাবে কোন কর্মচারী মুছে ফেলা হচ্ছে। যখন ব্যবহারকারী মুছুন বোতামটি ক্লিক করেন, আমি কেবলমাত্র Id3 টির মানটি ব্যবহার করব এবং এটি আমার সংগ্রহস্থল স্তরে প্রেরণ করব। আপনার কেবল Idসারণী থেকে কোনও রেকর্ড মুছতে হবে।

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

আমি আশা করি এটি দেখার মডেল এবং ডোমেন মডেল সম্পর্কে আপনার যে কোনও বিভ্রান্তি দূর করে।


5
@ কেনি: তারপরে এটি দেখান :) আমি যা বলতে চাইছিলাম তা হ'ল বলতে পারি যে আপনার কাছে একটি 50 টি বৈশিষ্ট্যযুক্ত একটি ডোমেন মডেল রয়েছে এবং আপনার দৃষ্টিভঙ্গিটি কেবল 5 প্রদর্শন করা দরকার তবে সমস্ত 50 টি সম্পত্তি প্রদর্শন করার জন্য 5 প্রেরণে কোনও লাভ নেই
ব্রেন্ডন ভোট

5
@ ব্রেন্ডনভোগ্ট - আপনি এটি ব্যাখ্যা করে একটি ভাল কাজ করেছেন, তবে "সমস্ত 50 টি সম্পত্তি প্রেরণে" কী খরচ হবে তা আমি বুঝতে পারি না। অন্যান্য কোড ইতিমধ্যে সমস্ত 50 টি বৈশিষ্ট্য সহ একটি মডেল অবজেক্ট তৈরি করেছে এবং কেবল 45 টি সম্পত্তি না পাঠাতে অন্য শ্রেণি বজায় রাখা উপযুক্ত বলে মনে হয় না - বিশেষ করে যদি আপনি ভবিষ্যতে 45 ​​টির মধ্যে একটিও সম্পত্তি প্রেরণ করতে চান।
কেনি এভিট

5
@ ব্রেন্ডনভোগ - আমার ধারণা লুকলেডের উত্তর আমাকে বুঝতে সাহায্য করে যে এগুলি কেন কার্যকর হতে পারে, বিশেষত একটি ভিউমোডেল ("বিভিন্ন ডাটাবেস সত্তা থেকে মানগুলি একত্রিত করতে পারে" "[যেখানে আমি ধরে নিচ্ছি যে বাক্যাংশটি ঠিক তেমন সত্য ছিল" "মডেল অবজেক্টস" এর সাথে প্রতিস্থাপন করা ডাটাবেস সত্তা]। কিন্তু তবুও, ভিউমোডেলগুলি নির্দিষ্ট কোন সমস্যাগুলির সমাধানের উদ্দেশ্যে ছিল? আপনার কোনও লিঙ্ক আছে? আমি নিজে কিছু পাইনি। [এবং আমি ক্ষমা চাইছি যদি মনে হয় আমি আপনাকে খুঁজে
নিচ্ছি

1
আমি সবেমাত্র কাউকে বলতে শুনেছি যে ভিউমোডেলগুলি ভিউব্যাগে স্টাফ না করে একক ভিউতে একাধিক সংগ্রহ (বা ক্রস মডেল বৈশিষ্ট্য) প্রেরণের একটি ভাল উপায়। আমার কাছে যৌক্তিক.
আয়শ

3
আমি সমালোচিত হওয়ার জন্য দুঃখিত তবে এই উত্তরটি দুর্ভাগ্যবশত, অসম্পূর্ণ। আপনার পৃষ্ঠায় প্রদর্শিত প্রদর্শনের প্রয়োজন হিসাবে কেবল ভিউমোডেলকে সংজ্ঞায়িত করা "গাড়ি কী?" এবং একটি উত্তর পেয়েছে "এটি বিমান নয়"। ঠিক আছে সত্য তবে খুব সহায়ক নয়। ভিএম এর আরও সঠিক সংজ্ঞা হ'ল "আপনার পৃষ্ঠাটি রেন্ডার করার জন্য আপনার প্রয়োজনীয় সমস্ত কিছুই"। আপনি নীচে পড়তে থাকলে আমি আপনার ভিএম সঠিকভাবে এবং সহজে তৈরি করার জন্য প্রয়োজনীয় উপাদানগুলি সনাক্ত করেছি, অনেক ক্ষেত্রে আপনার বিদ্যমান ডোমেন মডেলগুলি এবং উপস্থাপনা মডেলগুলিকে উপকৃত করতে।
স্যাম

133

ভিউ মডেল এমন একটি শ্রেণি যা নির্দিষ্ট ভিউতে ব্যবহৃত ডেটা মডেলকে উপস্থাপন করে। আমরা এই ক্লাসটি একটি লগইন পৃষ্ঠার মডেল হিসাবে ব্যবহার করতে পারি:

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

যা এই ফলাফলটি তৈরি করে (বৈধতা বার্তাগুলি সহ ফর্ম জমা দেওয়ার পরে পর্দা নেওয়া হয়):

আপনি দেখতে পাচ্ছেন, একটি ভিউ মডেলের অনেক ভূমিকা রয়েছে:

  • মডেলগুলি দেখুন কেবলমাত্র ক্ষেত্রের সমন্বয়ে একটি দর্শন দলিল করে, যা দর্শনে উপস্থাপন করা হয়।
  • মডেলগুলিতে ডেটা টিকা বা IDataErrorInfo ব্যবহার করে নির্দিষ্ট বৈধকরণের নিয়ম থাকতে পারে।
  • দেখুন মডেল সংজ্ঞায়িত একটি দৃশ্য (জন্য হওয়া উচিত কিভাবে 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
} 

আমি পাতলা ব্যবহারকারীর.মোধার ফার্স্ট নেম + "" + ইউজারমোথার.লাস্টনেমটি ভিউ মডেল এন্ডে করা উচিত। সমস্ত লজিক ভিউ মডেল প্রান্তে করা উচিত।
কুরকুলা

3
@ চান্দানা: আমি বিশ্বাস করি ভিউ মডেলে সাধারণ কনটেক্সটেশন করা যায়। দুটি ক্ষেত্র উন্মুক্ত করার কোনও কারণ নেই, যদি সেগুলি একত্রে উপস্থাপিত করা হয়।
LukLed

82

সম্পাদনা: আমি আমার ব্লগে এই উত্তরটি আপডেট করেছি:

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

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

1
@ সাম 'ভিউ মডেলগুলিতে প্রায়শই উপস্থাপনা মডেল এবং ডিটিও'র সমান বৈশিষ্ট্য থাকে এবং এই কারণে তারা প্রায়শই অন্যটির জন্য বিভ্রান্ত হয়।' এর অর্থ কী যে তারা সাধারণত উপস্থাপনা মডেলের পরিবর্তে ব্যবহৃত হয় , বা এগুলি কি উপস্থাপনা মডেল / ডিটিওগুলি ধারণ করে?
আলেকজান্ডার ডার্ক

2
@ আলেকজান্ডারডার্ক এগুলি বিভিন্ন উদ্দেশ্যে ব্যবহৃত হয়। তারা একে অপরের জন্য বিভ্রান্ত হয় (ত্রুটিযুক্ত)। না, আপনি সাধারণত কোনও ভিউ মডেলের জায়গায় কোনও প্রেস মডেল ব্যবহার করবেন না। আরও সাধারণভাবে MyViewModel<MyPresModel>
স্যাম

2
@ স্যাম ধরে নিচ্ছেন মডেল অবজেক্টগুলি লাইভ অবজেক্ট যেমন নিবার্নেট মডেল .. সুতরাং বিজনেসওবজেক্টের মাধ্যমে আমরা কী মডেল / লাইভ অবজেক্টগুলি সরাসরি দেখার জন্য প্রকাশ করি না? অর্থাত্ ব্যবসায়ের বস্তুটি সরাসরি ডাটাবেস স্থিতি সংশোধন করতে ব্যবহার করা যেতে পারে? এছাড়াও, নেস্টেড ভিউ মডেলগুলি সম্পর্কে কী? এর জন্য একাধিক ব্যবসায়িক বস্তুর বৈশিষ্ট্য প্রয়োজন, তাই না?
মুহাম্মদ আলী

22

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

যদি খুব কম ভিউ-নির্দিষ্ট ডেটা এবং / বা ট্রান্সফরমেশন থাকে তবে আপনি নিজেই মডেলটি ব্যবহার করতে পারেন


19

আমি সমস্ত পোস্ট পড়িনি তবে প্রতিটি উত্তরে এমন একটি ধারণা অনুপস্থিত মনে হচ্ছে যা সত্যই আমাকে "এটি পেতে" সাহায্য করেছিল ...

যদি কোনও মডেল কোনও ডাটাবেস সারণির অনুরূপ হয় , তবে একটি ভিউমোডেল একটি ডাটাবেস ভিউয়ের অনুরূপ - একটি ভিউ সাধারণত একটি টেবিল থেকে অল্প পরিমাণে ডেটা, বা একাধিক টেবিল (যোগ দেয়) থেকে জটিল সেটগুলির ডেটা দেয়।

আমি ভিউমোডেলগুলি ব্যবহার করে একটি ভিউ / ফর্মের তথ্য প্রেরণে ব্যবহার করি এবং ফর্মটি যখন নিয়ন্ত্রকের কাছে ফিরে আসে তখন সেই তথ্যটি একটি বৈধ মডেল হিসাবে স্থানান্তরিত করে - তালিকাগুলি (আইনিউনামেবল) সংরক্ষণ করার জন্য খুব কার্যকর।


11

এমভিসির একটি ভিউ মডেল নেই: এটির একটি মডেল, ভিউ এবং নিয়ামক রয়েছে। একটি ভিউ মডেল এমভিভিএম (মডেল-ভিউ-ভিউ মডেল) এর অংশ 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");
        }
    }
}

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


এমভিভিএম আর্কিটেকচারের অন্তর্দৃষ্টিটির জন্য আপনাকে ধন্যবাদ, তবে কেন এমভিসি ঠিক আছে না? আপনার যুক্তি প্রশ্নবিদ্ধ এবং পক্ষপাতিত্ব সন্দেহজনক। মঞ্জুর, আমি এমভিভিএম সম্পর্কে কিছুই জানি না, তবে এমভিসি-র মতো কোনও স্থাপত্য যদি 50k লাইন কোডের লেখার সাথে আচরণের নকল করতে পারে তবে বড় কথাটি কী?
শেফ_কোড

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

1
@ জিরোইন সংক্ষিপ্ত বিবরণ এমভিসি চুরি এবং ম্যাঙ্গাল হয়েছে। হ্যাঁ এমভিসির একটি ভিএম নেই তবে এটিতে কোনও সংগ্রহশালা বা কোনও পরিষেবা স্তর নেই এবং সেগুলি অবজেক্টগুলি ওয়েব সাইটে ব্যাপকভাবে ব্যবহৃত হয়। আমি বিশ্বাস করি যে ওপি "এমভিসিতে আমি কীভাবে একটি ভিএম প্রবর্তন এবং ব্যবহার করব" জিজ্ঞাসা করছে। এমভিসির নতুন অর্থের ক্ষেত্রে এমন কোনও মডেল নয় যেখানে ব্যবসার যুক্তি যুক্ত। ব্যবসায়িক যুক্তি এমভিসি বা এমভিভিএম ব্যবহার করে কোনও ওয়েব বা একটি ডেস্কটপ অ্যাপ্লিকেশানের জন্য একটি পরিষেবা স্তরের অন্তর্ভুক্ত। শব্দের মডেলটি ব্যবসায় স্তরগুলিকে বর্ণনা করে যা পরিষেবা স্তরটিতে / থেকে পাস করা হয়। এই সংজ্ঞাগুলি এমভিসির মূল বিবরণ থেকে সম্পূর্ণ পৃথক।
স্যাম

1
@ স্যাম কোনও ওয়েবসাইটের অংশ নয় এমন সমস্ত কিছুকে এমভিসির অংশ বলা যেতে পারে। এমভিসির কোনও নতুন অর্থ নেই। সঠিক অর্থ এবং "সম্পূর্ণরূপে সম্পর্কিত নয় এমন কিছু যা লোকেদের এমভিসির সাথে বিভ্রান্ত করে" -মিনান। মডেলটি ব্যবসায়ের যুক্তির জন্য দায়ী, এমনটি বলে না যে মডেলটিতে ব্যবসায়িক যুক্তি কোড করা হয়। বেশিরভাগ সময় মডেল অ্যাপ্লিকেশনটির সম্মুখভাগ হিসাবে কাজ করে।
জেরোইন

মাইক্রোসফ্টের এমভিসিতে আমি যে প্রধান ত্রুটি দেখতে পাই তা হ'ল একটি ভিউ সহ একটি মডেলকে লক করা। এটি বিগত ২০ বছর ধরে এন-টিয়ার ডিজাইনে চলছে এমন সমস্ত বিচ্ছিন্নতার পুরো উদ্দেশ্যটি নিজেই পরাস্ত করে। তারা আমাদের সময় নষ্ট করে ২০০২ সালে "ওয়েব ফর্ম" ব্যবহার করতে বাধ্য করে যা ওয়েব ওয়ার্ল্ডে তোলা অন্য একটি ডেস্কটপ দ্বারা অনুপ্রাণিত মডেল। এখন তারা তা ছুঁড়েছে তবে ওয়েব দেবের জন্য এই নতুন দৃষ্টান্তে আবার একটি ডেস্কটপ মডেল উত্তোলন করেছে। মাঝামাঝি সময়ে গুগল এবং অন্যরা দৈত্য ক্লায়েন্ট-সাইড মডেল তৈরি করছে যা এগুলি পৃথক করে দেয়। আমি 1998 এর পুরানো এএসপি ভিবিএস স্ক্রিপ্ট ভাবছিলাম তাদের সত্যিকারের ওয়েব ডেভ সিস্টেম ছিল।
স্টোকলি

11

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

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

এখন আমরা এই ভিউমোডেলটি ভিউতে ব্যবহার করি

@ মডেল প্রজেক্টনাম.মোডেল.স্টুডেন্টভিউ মডেল

এখন আমরা স্টুডভিউমোডেলের সমস্ত সম্পত্তি এবং ভিউতে উত্তরাধিকারসূত্রে প্রাপ্ত ক্লাসে অ্যাক্সেস করতে সক্ষম।


10

অনেক বড় উদাহরণ, আমাকে পরিষ্কার এবং খাস্তা উপায়ে ব্যাখ্যা করি।

ভিউমোডেল = মডেল যা দর্শনের জন্য তৈরি করা হয়।

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

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

মডেলগুলির কয়েকটি উদাহরণ নীচে রয়েছে

  • একটি ভিউ পৃষ্ঠায় সত্তা থেকে অধিক সংখ্যক থেকে ডেটা তালিকাভুক্ত করতে - আমরা একটি ভিউ মডেল তৈরি করতে পারি এবং সমস্ত সত্তার বৈশিষ্ট্য থাকতে পারি যার জন্য আমরা ডেটা তালিকাবদ্ধ করতে চাই। সেই ডাটাবেস সত্তাগুলিতে যোগদান করুন এবং মডেল বৈশিষ্ট্যগুলি দেখুন এবং একটি সারণী আকারে বিভিন্ন সত্তার ডেটা দেখানোর জন্য ভিউতে ফিরে যান
  • ভিউ মডেল কেবলমাত্র একক সত্তার নির্দিষ্ট ক্ষেত্রগুলি সংজ্ঞায়িত করতে পারে যা দেখার জন্য প্রয়োজনীয়।

ভিউমোডেলটি একাধিক সত্তায় রেকর্ড সন্নিবেশ করতে, আপডেট করতে ব্যবহার করা যেতে পারে তবে ভিউমোডেলের মূল ব্যবহারটি একক দৃশ্যে একাধিক সত্তা (মডেল) থেকে কলাম প্রদর্শন করা।

ভিউমোডেল তৈরির পদ্ধতিটি মডেল তৈরির মতোই, ভিউমোডেলের জন্য ভিউ তৈরির পদ্ধতিও মডেলের জন্য ভিউ তৈরির মতো।

এখানে ভিউমোডেল ব্যবহার করে তালিকার ডেটার একটি ছোট উদাহরণ রয়েছে

আশা করি এটি কার্যকর হবে।


6

ভিউমোডেল এমন একতরফা কাজ যা এমভিসির কাঠামোর ধারণাগত আচ্ছন্নতাকে প্যাচ করে। এটি 3-স্তর মডেল-ভিউ-কন্ট্রোলার আর্কিটেকচারের 4 র্থ স্তর উপস্থাপন করে। যখন মডেলের (ডোমেন মডেল) উপযুক্ত না হয়, খুব বড় (২-৩ টির চেয়ে বড় ক্ষেত্র) ভিউয়ের জন্য হয়, তখন আমরা এটিকে ভিউতে পাস করার জন্য আরও ছোট ভিডমডেল তৈরি করি।


1

একটি ভিউ মডেল তথ্যগুলির একটি ধারণাগত মডেল। উদাহরণস্বরূপ এর ব্যবহারটি হয় হয় কোনও উপসেট পাবেন বা বিভিন্ন টেবিল থেকে ডেটা একত্রিত করুন।

আপনি কেবল নির্দিষ্ট বৈশিষ্ট্যই পেতে চাইতে পারেন, সুতরাং এটি আপনাকে কেবলমাত্র সেইগুলি লোড করার অনুমতি দেয় এবং অতিরিক্ত সংযোজনীয় বৈশিষ্ট্যগুলি নয়


1
  • ভিউমোডেলে এমন ক্ষেত্রগুলি থাকে যা ভিউতে উপস্থাপিত হয় (লেবেলফোর্ড, সম্পাদকফোর্স, প্রদর্শনের জন্য সহায়তাকারীদের জন্য)
  • ভিউমোডেলের ডেটা টিকা বা IDataErrorInfo ব্যবহার করে নির্দিষ্ট বৈধকরণের নিয়ম থাকতে পারে।
  • ভিউমোডেলে বিভিন্ন ডেটা মডেল বা ডেটা উত্স থেকে একাধিক সত্তা বা অবজেক্ট থাকতে পারে।

ভিউমোডেল ডিজাইন করা

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);
} 
  1. ভিউমোডেলে কেবল সেই ক্ষেত্র / ডেটা রাখুন যা আপনি ভিউ / পৃষ্ঠায় প্রদর্শন করতে চান।
  2. যেহেতু দর্শন ভিউমোডেলের বৈশিষ্ট্যগুলি পুনরায় উপস্থাপন করে, তাই এটি রেন্ডারিং এবং রক্ষণাবেক্ষণের পক্ষে সহজ।
  3. ভিউমোডেল আরও জটিল হয়ে উঠলে ম্যাপার ব্যবহার করুন।

1

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

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

সুতরাং উপরের উদাহরণে স্থান এবং বিভাগ দুটি পৃথক সত্তা এবং প্লেস ক্যাটাগরির ভিউ মডেলটি ভিউমোডেল যা আমরা ভিউতে ব্যবহার করতে পারি।


আপনার উদাহরণগুলি এত পরিষ্কার নয়। উপরে বর্ণিত যা হ'ল একটি ভিউমোডেল তার দর্শনটির সাথে ডেটা সংযুক্ত করে। আপনি যদি ব্লিপএজ্যাক্সের ভিউমোডেলগুলিতে লক্ষ্য করেন তবে আপনি এমন ক্লাস দেখতে পাবেন যা এটির জন্য উপযুক্ত।
হারমান ভ্যান ডের ব্লম

0

আপনি যদি ভিউমোডেলসের সাথে "বেসলাইন" ওয়েব অ্যাপ্লিকেশন সেটআপ করবেন কীভাবে কোডটি অধ্যয়ন করতে চান আমি এই কোডটি গিটহাবটিতে ডাউনলোড করতে পরামর্শ দিতে পারি: https://github.com/ajsaulsberry/BlipAjax । আমি বড় এন্টারপ্রাইজ অ্যাপ্লিকেশন বিকাশ করেছি। আপনি যখন কোনও ভাল আর্কিটেকচার সেটআপ করতে সমস্যাযুক্ত হন যা এই সমস্ত "ভিউমোডেল" কার্যকারিতা পরিচালনা করে। আমি মনে করি ব্লিপএজ্যাক্স দিয়ে আপনার খুব ভাল "বেসলাইন" শুরু হবে। এটি কেবল একটি সাধারণ ওয়েবসাইট, তবে এর সরলতায় দুর্দান্ত। অ্যাপ্লিকেশনটিতে আসলে কী প্রয়োজন তা নির্দেশ করার জন্য তারা ইংরাজী ভাষাটি যেভাবে ব্যবহার করেছিল তা আমি পছন্দ করি।

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