এক নজরে একাধিক মডেল


302

আমি এক ভিউতে 2 টি মডেল রাখতে চাই। পৃষ্ঠাটিতে LoginViewModelএবং উভয়ই রয়েছে RegisterViewModel

যেমন

public class LoginViewModel
{
    public string Email { get; set; }
    public string Password { get; set; }
}

public class RegisterViewModel
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
}

আমার কি আরও একটি ভিউমোডেল তৈরি করতে হবে যা এই 2 টি ভিউমোডেলগুলিকে ধারণ করে?

public BigViewModel
{
    public LoginViewModel LoginViewModel{get; set;}
    public RegisterViewModel RegisterViewModel {get; set;}
}

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

(উপায় ছাড়া BigViewModel) এর মতো আর কোনও উপায় নেই :

 @model ViewModel.RegisterViewModel
 @using (Html.BeginForm("Login", "Auth", FormMethod.Post))
 {
        @Html.TextBoxFor(model => model.Name)
        @Html.TextBoxFor(model => model.Email)
        @Html.PasswordFor(model => model.Password)
 }

 @model ViewModel.LoginViewModel
 @using (Html.BeginForm("Login", "Auth", FormMethod.Post))
 {
        @Html.TextBoxFor(model => model.Email)
        @Html.PasswordFor(model => model.Password)
 }


1
@ সা serদ সর্পোশন, বিভিন্ন বিকল্পের সাথে লিঙ্কের জন্য আপনাকে অনেক ধন্যবাদ, 4 বছর পরে আপনি একটি মন্তব্য পোস্ট করেছিলেন এবং এটি আমাকে সহায়তা করেছে, আমি স্রেফ ViewBag
ভিউটিতে প্রতিটিটির

@ স্টম সবেমাত্র একটি এফওয়াইআই: পোস্ট লেখক সর্বদা একটি বিজ্ঞপ্তি পান তবে আপনি যদি অন্য কাউকে অবহিত করতে চান তবে আপনার @নামটির আগে আপনার এখানে রাখা উচিত, যেমন আমি এখানে করেছি।
jpaugh

উত্তর:


260

প্রচুর উপায় আছে ...

  1. আপনার বিগভিউ মডেলটি দিয়ে আপনি:

    @model BigViewModel    
    @using(Html.BeginForm()) {
        @Html.EditorFor(o => o.LoginViewModel.Email)
        ...
    }
    
  2. আপনি 2 টি অতিরিক্ত মতামত তৈরি করতে পারেন

    Login.cshtml

    @model ViewModel.LoginViewModel
    @using (Html.BeginForm("Login", "Auth", FormMethod.Post))
    {
        @Html.TextBoxFor(model => model.Email)
        @Html.PasswordFor(model => model.Password)
    }
    

    এবং register.cshtml একই জিনিস

    তৈরির পরে আপনাকে সেগুলি মূল দৃশ্যে রেন্ডার করতে হবে এবং ভিউ মডেল / ভিউডেটা তাদের পাস করতে হবে

    সুতরাং এটি এর মতো হতে পারে:

    @{Html.RenderPartial("login", ViewBag.Login);}
    @{Html.RenderPartial("register", ViewBag.Register);}
    

    অথবা

    @{Html.RenderPartial("login", Model.LoginViewModel)}
    @{Html.RenderPartial("register", Model.RegisterViewModel)}
    
  3. আপনার ওয়েবসাইটের এজ্যাক্স অংশগুলি আরও স্বাধীন হয়ে ওঠে

  4. iframes, তবে সম্ভবত এটি হয় না


2
আংশিক দৃষ্টিভঙ্গি ব্যবহারের কারণে 2 টি পাঠ্যবক্সে ফর্মের একই নাম থাকলে এটি কী সমস্যা?
শান ম্লেয়ান

2
না, ফায়ারব্যাগ (ফায়ারফক্সের মতো) ব্যবহার করে উপাদানটিতে নিজেই সূক্ষ্মভাবে ক্লিক করা উচিত এবং আপনি আইডি = "লগইনভিউমোডেল_ইমেল" নাম = "লগইনভিউমোডেল.ইমেল" এর মতো কিছু দেখতে পাবেন, তাই বাস্তবে এগুলি অনন্য! একটি ভিউ মডেল আপনার যা প্রয়োজন তা হওয়া উচিত, কেবল প্রতিটি পৃষ্ঠা আলাদা ইউআরএলে পোস্ট করুন এবং আপনার ভাল হওয়া উচিত
হারুন

@ লল কোডার আসলে এটি 2 টি রূপ, প্রতিটি ভিউমোডেলের জন্য একটি, তবে যাইহোক যাইহোক আপনার যদি একই নামের সাথে 2 বা 3 বা আরও বেশি থাকে তবে আপনি কেবল সার্ভারের পাশে সেই নামের সাথে একটি অ্যারে পাবেন (যদি আপনি এটি প্যারামে রাখেন তবে পোস্ট অ্যাকশন পদ্ধতির)
ওমু

@ চক নরিস আমি এসপ নেটওয়্যার এমভিসি 4 ব্যবহার করছি এবং আপনার আংশিক পর্যালোচনা কৌশল প্রয়োগ করেছি তবে @Html.RenderActionএকটি ত্রুটির কথা জানিয়ে দিচ্ছি যে এক্সপ্রেশনকে অবশ্যই একটি মূল্য ফিরিয়ে দিতে হবে
ডিপটেকটনস

1
এটি কীভাবে কাজ করে তা ব্যাখ্যা করতে পারেন? আমি বুঝতে পারি এটি একটি সমস্যার সমাধান, তবে আমি এটির কোনও ধারণা করতে পারি না। আমার এই সমস্যার একটি সামান্য (কিছুটা আলাদা) উদাহরণ রয়েছে এবং আমি কীভাবে এটি ঘটাতে পারি তা বুঝতে পারি না।
আন্দ্রে

127

আমি এটি Html.RenderActionএবং আংশিকভিউ ফলাফলগুলি ব্যবহারের জন্য সুপারিশ করব ; এটি আপনাকে একই ডেটা প্রদর্শনের অনুমতি দেবে, তবে প্রতিটি আংশিক দৃশ্যে এখনও একটি একক দর্শন মডেল থাকবে এবং এটির প্রয়োজনীয়তা সরিয়ে ফেলবেBigViewModel

সুতরাং আপনার ভিউতে নিম্নলিখিতগুলির মতো কিছু রয়েছে:

@Html.RenderAction("Login")
@Html.RenderAction("Register")

যেখানে Loginএবং Registerআপনার নিয়ামকের উভয় ক্রিয়াকলাপ নীচের মত সংজ্ঞায়িত হয়েছে:

public PartialViewResult Login( )
{
    return PartialView( "Login", new LoginViewModel() );
}

public PartialViewResult Register( )
{
    return PartialView( "Register", new RegisterViewModel() );
}

Login& Registerতারপর, অথবা ভাগ করা ফোল্ডার পারেন বর্তমান দেখুন ফোল্ডারে অবস্থিত ব্যবহারকারীর নিয়ন্ত্রণগুলি হবে এবং ভালো কিছু চাই:

/ ভিউজ / শেয়ার্ড / লোগিন.cshtml: (বা / ভিউস / মাইভিউ / লোগিন.cshtml)

@model LoginViewModel
@using (Html.BeginForm("Login", "Auth", FormMethod.Post))
{
    @Html.TextBoxFor(model => model.Email)
    @Html.PasswordFor(model => model.Password)
}

/ ভিউজ / শেয়ার্ড / রেজিস্টার.cshtml: (বা / ভিউস / মাইভিউ / রেজিস্টার.cshtml)

@model ViewModel.RegisterViewModel
@using (Html.BeginForm("Login", "Auth", FormMethod.Post))
{
    @Html.TextBoxFor(model => model.Name)
    @Html.TextBoxFor(model => model.Email)
    @Html.PasswordFor(model => model.Password)
}

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


4
এটি ডিজাইনিংয়ের ক্ষেত্রে প্রচুর অর্থে তৈরি করে, তবে দক্ষতার দিক থেকে, এমভিসি চক্রের 3 টি পূর্ণ চক্রের মধ্য দিয়ে যেতে হবে না? stackoverflow.com/questions/719027/renderation-renderpartial/…
শান

6
হ্যাঁ আপনি সঠিক: এটি প্রত্যেকের জন্য অতিরিক্ত পূর্ণ এমভিসি চক্র তৈরি করে RenderAction। আমি সবসময় ফিউচার প্যাকটির অংশটি ভুলে যাই কারণ আমার প্রকল্পে সর্বদা ডিফল্টরূপে সেই ডেল অন্তর্ভুক্ত থাকে। এটি অতিরিক্ত এমভিসি চক্রটি ডিজাইনের দিকে যে বিভাজন দেয় তা মূল্যবান কিনা তা অগ্রাধিকার এবং অ্যাপ্লিকেশন প্রয়োজনীয়তার উপর নির্ভর করে। আপনি RenderActionফলাফলগুলি ক্যাশে করতে পারেন এমন অনেক সময় যাতে আপনি গ্রহণ করেন শুধুমাত্র কন্ট্রোলার কারখানার মাধ্যমে সামান্য অতিরিক্ত প্রক্রিয়াজাতকরণ hit
TheRightChoyce

আমি উপরোক্ত বাস্তবায়ন করেছি .. আমি কী মিস করছি? দয়া করে সাহায্য: stackoverflow.com/questions/9677818/...
diegohb

পবিত্র বাজে! এটি গেটের ঠিক বাইরে আমার জন্য পুরোপুরি কাজ করেছে। আমি কেবল দু'জন ব্যবহারকারী নিয়ে একটি অভ্যন্তরীণ সাইট তৈরি করছি ... তাই দক্ষতা আমার সত্যিকারের উদ্বেগ নয় isn't ধন্যবাদ!
ডেরেক এভারমোর

1
আংশিকভিউ কাজ করার জন্য কোঁকড়া বন্ধনী ব্যবহার করতে হয়েছিল।
নাল

113

আরেকটি উপায় হ'ল:

@model Tuple<LoginViewModel,RegisterViewModel>

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

আপনার ক্ষেত্রে আপনি নিম্নলিখিত কোড ব্যবহার করে এটি প্রয়োগ করতে পারেন:

দেখুন মধ্যে:

@using YourProjectNamespace.Models;
@model Tuple<LoginViewModel,RegisterViewModel>

@using (Html.BeginForm("Login1", "Auth", FormMethod.Post))
{
        @Html.TextBoxFor(tuple => tuple.Item2.Name, new {@Name="Name"})
        @Html.TextBoxFor(tuple => tuple.Item2.Email, new {@Name="Email"})
        @Html.PasswordFor(tuple => tuple.Item2.Password, new {@Name="Password"})
}

@using (Html.BeginForm("Login2", "Auth", FormMethod.Post))
{
        @Html.TextBoxFor(tuple => tuple.Item1.Email, new {@Name="Email"})
        @Html.PasswordFor(tuple => tuple.Item1.Password, new {@Name="Password"})
}

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

যদি অ্যাকশন লিঙ্কের প্রয়োজন হয় আপনি ব্যবহার করতে পারেন:

@Html.ActionLink("Edit", "Edit", new { id=Model.Item1.Id })

দেখার জন্য নিয়ামকের পদ্ধতিতে, টাইপ টাইপের একটি ভেরিয়েবল তৈরি করতে হবে এবং তারপরে ভিউতে প্রেরণ করা হবে।

উদাহরণ:

public ActionResult Details()
{
    var tuple = new Tuple<LoginViewModel, RegisterViewModel>(new LoginViewModel(),new RegisterViewModel());
    return View(tuple);
}

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


এটি পরিচালনা করার জন্য এটি দুর্দান্ত উপায় ছিল, ধন্যবাদ! আমার যা প্রয়োজন ছিল তা করলাম।
টড ডেভিস

আমি এই চেষ্টা করেছি, কিন্তু যদি আমি ব্যবহার EditorForবা HiddenFor(যা আদর্শভাবে কি আমি ব্যবহার করতে চান) মডেল বৈশিষ্ট্য সেট না হলে Login1/ Login2নিয়ামক পদ্ধতি বলা হয়। সম্ভবত @Name=ম্যাপিং উপেক্ষা করা হচ্ছে। HiddenForএই পরিস্থিতির জন্য কি অন্য কিছু কৌশল প্রয়োজন?
গ্যারি চ্যাপম্যান

1
এটি কিছুতেই কাজ করবে না - ফর্মটি জমা দেওয়ার সময় আপনি মডেলটির সাথে বাঁধতে পারবেন না

@ হামিদ ধন্যবাদ হামিদ, এমভিসির একজন নবজাতকের জন্য, এটি আমার কাছে সবচেয়ে সরল উত্তর ছিল। ধন্যবাদ.
হ্যারল্ড_ফিনিচ

ফর্মটি জমা দেওয়ার সময় আপনি কীভাবে মডেলটিকে বাঁধেন?
মোহাম্মদ নুরাল্ডিন

28

একাধিক দর্শন মডেলযুক্ত একটি ভিউ মডেল ব্যবহার করুন:

   namespace MyProject.Web.ViewModels
   {
      public class UserViewModel
      {
          public UserDto User { get; set; }
          public ProductDto Product { get; set; }
          public AddressDto Address { get; set; }
      }
   }

আপনার দৃষ্টিতে:

  @model MyProject.Web.ViewModels.UserViewModel

  @Html.LabelFor(model => model.User.UserName)
  @Html.LabelFor(model => model.Product.ProductName)
  @Html.LabelFor(model => model.Address.StreetName)

1
এটি একটি দুর্দান্ত সমাধান, এবং মডেলের বৈধতা কোনও শঙ্ক ছাড়াই এখনও কাজ করে। ধন্যবাদ!
এএফএম-দিগন্ত

11

এই 2 টি মতামত রাখার জন্য আমাকে কি অন্য দৃষ্টিভঙ্গি তৈরি করতে হবে?

উত্তর: না

(বিগভিউ মডেল ছাড়াই) এর মতো আর কোনও উপায় নেই:

হ্যাঁ , আপনি টুপল ব্যবহার করতে পারেন (একাধিক মডেল থাকার কারণে যাদু নিয়ে আসে)।

কোড:

 @model Tuple<LoginViewModel, RegisterViewModel>


    @using (Html.BeginForm("Login", "Auth", FormMethod.Post))
    {
     @Html.TextBoxFor(tuple=> tuple.Item.Name)
     @Html.TextBoxFor(tuple=> tuple.Item.Email)
     @Html.PasswordFor(tuple=> tuple.Item.Password)
    }


    @using (Html.BeginForm("Login", "Auth", FormMethod.Post))
     {
      @Html.TextBoxFor(tuple=> tuple.Item1.Email)
      @Html.PasswordFor(tuple=> tuple.Item1.Password)
     }

এই নিয়ামকটি ফর্মটি স্বীকার করছে এমনটি কি সঠিকভাবে ম্যাপ করবে না? আমি ভেবেছিলাম "নাম" সন্ধানের আগে এটি আপনার ক্ষেত্রে "আইটেম" সন্ধান করবে।
সলডস্পেক 4444

7

আপনার মডেলগুলিতে এই মডেলকলেশন.সকে যুক্ত করুন

using System;
using System.Collections.Generic;

namespace ModelContainer
{
  public class ModelCollection
  {
   private Dictionary<Type, object> models = new Dictionary<Type, object>();

   public void AddModel<T>(T t)
   {
      models.Add(t.GetType(), t);
   }

   public T GetModel<T>()
   {
     return (T)models[typeof(T)];
   }
 }
}

নিয়ন্ত্রক:

public class SampleController : Controller
{
  public ActionResult Index()
  {
    var model1 = new Model1();
    var model2 = new Model2();
    var model3 = new Model3();

    // Do something

    var modelCollection = new ModelCollection();
    modelCollection.AddModel(model1);
    modelCollection.AddModel(model2);
    modelCollection.AddModel(model3);
    return View(modelCollection);
  }
}

দৃশ্য:

enter code here
@using Models
@model ModelCollection

@{
  ViewBag.Title = "Model1: " + ((Model.GetModel<Model1>()).Name);
}

<h2>Model2: @((Model.GetModel<Model2>()).Number</h2>

@((Model.GetModel<Model3>()).SomeProperty

আমি এই পদ্ধতির পছন্দ করি কারণ এটি আমাকে ছেদ করার প্রয়োজন ছাড়াই একই দৃশ্যে বিভিন্ন মডেল ব্যবহার করতে দেয়।
ম্যাট ছোট

6

এটি করার একটি সহজ উপায়

আমরা প্রথমে সমস্ত মডেল কল করতে পারি

@using project.Models

তারপরে আপনার মডেলটি ভিউব্যাগ সহ প্রেরণ করুন

// for list
ViewBag.Name = db.YourModel.ToList();

// for one
ViewBag.Name = db.YourModel.Find(id);

এবং দেখুন

// for list
List<YourModel> Name = (List<YourModel>)ViewBag.Name ;

//for one
YourModel Name = (YourModel)ViewBag.Name ;

তাহলে সহজেই মডেলের মতো এটি ব্যবহার করুন


3

আমার পরামর্শটি হল একটি বড় ভিউ মডেল তৈরি করা:

public BigViewModel
{
    public LoginViewModel LoginViewModel{get; set;}
    public RegisterViewModel RegisterViewModel {get; set;}
}

আপনার ইনডেক্স.সিএসটিএমএলে, উদাহরণস্বরূপ যদি আপনার 2 টি পার্টিয়াল থাকে:

@addTagHelper *,Microsoft.AspNetCore.Mvc.TagHelpers
@model .BigViewModel

@await Html.PartialAsync("_LoginViewPartial", Model.LoginViewModel)

@await Html.PartialAsync("_RegisterViewPartial ", Model.RegisterViewModel )

এবং নিয়ামক:

model=new BigViewModel();
model.LoginViewModel=new LoginViewModel();
model.RegisterViewModel=new RegisterViewModel(); 

2

আমি বলতে চাই যে আমার সমাধানটি এই স্ট্যাকওভারফ্লো পৃষ্ঠায় প্রদত্ত উত্তরের মতো ছিল: এএসপি.নেট এমভিসি 4, এক দর্শনে একাধিক মডেল?

তবে, আমার ক্ষেত্রে, তারা তাদের নিয়ামকটিতে যে লিনক ক্যোয়ারী ব্যবহার করেছিল তা আমার পক্ষে কার্যকর হয়নি।

এটি ক্যোয়ারী বলা হয়:

var viewModels = 
        (from e in db.Engineers
         select new MyViewModel
         {
             Engineer = e,
             Elements = e.Elements,
         })
        .ToList();

ফলস্বরূপ, "আপনার দৃষ্টিতে কেবল উল্লেখ করুন যে আপনি দেখছেন মডেলগুলির সংগ্রহটি ব্যবহার করছেন" আমার পক্ষেও কাজ করে না।

যাইহোক, এই সমাধানটিতে সামান্য প্রকরণটি আমার পক্ষে কাজ করেছিল। এটি যে কাউকে সহায়তা করে সে ক্ষেত্রে আমার সমাধান এখানে।

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

namespace TaskBoard.Models.ViewModels
{
    public class TeamBoards
    {
        public Team Team { get; set; }
        public List<Board> Boards { get; set; }
    }
}

এখন এটি আমার নিয়ামক। উপরের লিঙ্কটিতে সমাধানটি থেকে এটি সবচেয়ে গুরুত্বপূর্ণ পার্থক্য। আমি ভিউমোডেলটি ভিউতে আলাদাভাবে প্রেরণের জন্য তৈরি করি।

public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }

            TeamBoards teamBoards = new TeamBoards();
            teamBoards.Boards = (from b in db.Boards
                                 where b.TeamId == id
                                 select b).ToList();
            teamBoards.Team = (from t in db.Teams
                               where t.TeamId == id
                               select t).FirstOrDefault();

            if (teamBoards == null)
            {
                return HttpNotFound();
            }
            return View(teamBoards);
        }

তারপরে আমার দৃষ্টিতে আমি এটিকে তালিকা হিসাবে নির্দিষ্ট করি না। আমি কেবল "@ মডেল টাস্কবোর্ড.মোডেলস.ভিউমোডেলস.টিমবোর্ডস" করি তবে আমি যখন টিমের বোর্ডগুলিতে পুনরাবৃত্তি করি তখন কেবল আমার প্রত্যেকটির জন্য একটি দরকার। এখানে আমার মতামত:

@model TaskBoard.Models.ViewModels.TeamBoards

@{
    ViewBag.Title = "Details";
}

<h2>Details</h2>

<div>
    <h4>Team</h4>
    <hr />


    @Html.ActionLink("Create New Board", "Create", "Board", new { TeamId = @Model.Team.TeamId}, null)
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => Model.Team.Name)
        </dt>

        <dd>
            @Html.DisplayFor(model => Model.Team.Name)
            <ul>
                @foreach(var board in Model.Boards)
                { 
                    <li>@Html.DisplayFor(model => board.BoardName)</li>
                }
            </ul>
        </dd>

    </dl>
</div>
<p>
    @Html.ActionLink("Edit", "Edit", new { id = Model.Team.TeamId }) |
    @Html.ActionLink("Back to List", "Index")
</p>

আমি এএসপি.নেট এমভিসি তে মোটামুটি নতুন তাই এটি বের করতে আমার কিছুটা সময় লেগেছে। সুতরাং, আমি আশা করি এই পোস্টটি কাউকে স্বল্প সময়ের মধ্যে তাদের প্রকল্পের জন্য এটি নির্ণয় করতে সহায়তা করবে। :-)



1
  1. আপনার মডেল এক নতুন শ্রেণী এবং বৈশিষ্ট্য তৈরি করুন LoginViewModelএবং RegisterViewModel:

    public class UserDefinedModel() 
    {
        property a1 as LoginViewModel 
        property a2 as RegisterViewModel 
    }
  2. তারপরে UserDefinedModelআপনার দৃষ্টিতে ব্যবহার করুন।


1
হ্যাঁ, এটি আমার পক্ষে কাজ করে। তারপরে আমি এটিকে এরকম উল্লেখ করেছি: (দর্শনটির শীর্ষে মডেলটি ঘোষিত হয়েছিল inside এর ভিতরে দুটি মডেল ছিল: প্রোফাইল এবং ইমেল স্টাফ @ কন্ট্রোলারটি নীচে @ নোটো পোস্ট ব্যবহার করে আমি একটি মডেল পূরণ করেছি I আমি কেবলমাত্র একটি ইনপুট জন্য এটি ব্যবহার করছিলাম বলে অন্য যেটি পূরণ করার দরকার ছিল না
জাস্টজহান

0

এটি IEnumerable সহ একটি সরলীকৃত উদাহরণ।

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

@using DelegatePortal.ViewModels;

@model SearchViewModel

@using (Html.BeginForm("Search", "Delegate", FormMethod.Post))
{

                Employee First Name
                @Html.EditorFor(model => model.SearchParams.FirstName,
new { htmlAttributes = new { @class = "form-control form-control-sm " } })

                <input type="submit" id="getResults" value="SEARCH" class="btn btn-primary btn-lg btn-block" />

}
<br />
    @(Html
        .Grid(Model.Delegates)
        .Build(columns =>
        {
            columns.Add(model => model.Id).Titled("Id").Css("collapse");
            columns.Add(model => model.LastName).Titled("Last Name");
            columns.Add(model => model.FirstName).Titled("First Name");
        })

...)

SearchViewModel.cs:

namespace DelegatePortal.ViewModels
{
    public class SearchViewModel
    {
        public IEnumerable<DelegatePortal.Models.DelegateView> Delegates { get; set; }

        public SearchParamsViewModel SearchParams { get; set; }
....

DelegateController.cs:

// GET: /Delegate/Search
    public ActionResult Search(String firstName)
    {
        SearchViewModel model = new SearchViewModel();
        model.Delegates = db.Set<DelegateView>();
        return View(model);
    }

    // POST: /Delegate/Search
    [HttpPost]
    public ActionResult Search(SearchParamsViewModel searchParams)
    {
        String firstName = searchParams.FirstName;
        SearchViewModel model = new SearchViewModel();

        if (firstName != null)
            model.Delegates = db.Set<DelegateView>().Where(x => x.FirstName == firstName);

        return View(model);
    }

SearchParamsViewModel.cs:

namespace DelegatePortal.ViewModels
{
    public class SearchParamsViewModel
    {
        public string FirstName { get; set; }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.