এএসপি এমভিসি 3 এ এক ভিউতে দুটি মডেল


92

আমার কাছে 2 টি মডেল রয়েছে:

public class Person
{
    public int PersonID { get; set; }
    public string PersonName { get; set; }
}
public class Order
{
    public int OrderID { get; set; }
    public int TotalSum { get; set; }
}

আমি সিঙ্গেল ভিউতে দু'টি ক্লাসের অবজেক্টগুলি সম্পাদনা করতে চাই, সুতরাং আমার এর মতো কিছু দরকার:

@model _try2models.Models.Person
@model _try2models.Models.Order

@using(Html.BeginForm())
{
    @Html.EditorFor(x => x.PersonID)
    @Html.EditorFor(x => x.PersonName)
    @Html.EditorFor(x=>x.OrderID)
    @Html.EditorFor(x => x.TotalSum)
}

এটি অবশ্যই কাজ করে না:। Cshtml ফাইলে কেবল একটি 'মডেল' বিবৃতি অনুমোদিত। কিছু workaround হতে পারে?


4
আমার উত্তর কি আপনাকে সাহায্য করে?
অ্যান্ড্রু

আমি ব্যবহার করতাম ViewBagসঙ্গে আমার জন্য কাজ দৃশ্য প্রত্যেকের জন্য, চেক এই একাধিক বিকল্পের জানতে, একটু সময় একটি দৃশ্য মডেল বা আংশিক দৃশ্য তৈরি করার পরিবর্তে আমার জন্য সংরক্ষিত
shaijut

উত্তর:


119

উভয় মডেল সমন্বিত একটি প্যারেন্ট ভিউ মডেল তৈরি করুন।

public class MainPageModel{
    public Model1 Model1{get; set;}
    public Model2 Model2{get; set;}
}

এইভাবে আপনি পরের তারিখে খুব ন্যূনতম প্রচেষ্টা সহ অতিরিক্ত মডেল যুক্ত করতে পারেন।


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

4
@ অ্যান্ডি - আপনি উপরে পরামর্শ অনুসারে মডেলটি তৈরি করেছি। কিন্তু আমি যখন নিয়ামকটিতে ডান ক্লিক করি এবং ক্রড কন্ট্রোলার তৈরি করার চেষ্টা করি, তখন এটি কাজ করছে না? কোনও পরামর্শ? আমি কীভাবে উপরের মডেলের জন্য স্বয়ংক্রিয় ভিউ দিয়ে ক্রড কন্ট্রোলার তৈরি করতে পারি?
নভিসেমে

4
এই সমস্যাটি সমাধান করতে আমি যে সমস্ত পদ্ধতির মুখ দেখেছি তার মধ্যে এটিই আমার পক্ষে সবচেয়ে ভাল কাজ করেছে। এটি এখন পর্যন্ত সবচেয়ে সহজ সমাধান যা কাজ করে।
সিআরান গ্যালাগর

4
আপনি যখন নিজেকে জিজ্ঞাসা করবেন তখন মায়ের কথা "আমি এর আগে কেন ভাবিনি?" দুর্দান্ত সমাধান
রাফায়েল এএমএস

4
@ অ্যান্ডি আমি কন্ট্রোলারে কীভাবে সম্পর্কিত মডেলগুলির পদ্ধতি প্রকাশ করব?
ভোল্টিল 3

53

টিউপলটি ব্যবহার করতে আপনাকে নিম্নলিখিতটি করতে হবে, দৃষ্টিতে মডেলটি এতে পরিবর্তন করুন:

@model Tuple<Person,Order>

@html পদ্ধতিগুলি ব্যবহার করতে আপনাকে নিম্নলিখিতগুলি করতে হবে:

@Html.DisplayNameFor(tuple => tuple.Item1.PersonId)

বা

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

আইটেম 1 টিউপল পদ্ধতিতে প্রথম প্যারামিটারটি নির্দেশ করে এবং দ্বিতীয় আইটেমটি অ্যাক্সেস করতে আপনি আইটেম 2 ব্যবহার করতে পারেন।

আপনার নিয়ামকটিতে আপনাকে টাইপল টাইপের একটি ভেরিয়েবল তৈরি করতে হবে এবং তারপরে এটি ভিউতে প্রেরণ করতে হবে:

    public ActionResult Details(int id = 0)
    {
        Person person = db.Persons.Find(id);
        if (person == null)
        {
            return HttpNotFound();
        }
        var tuple = new Tuple<Person, Order>(person,new Order());

        return View(tuple);
    }

আর একটি উদাহরণ: এক দৃষ্টিতে একাধিক মডেল


4
Tupleএই ক্ষেত্রে কখনই ব্যবহার করবেন না - ওপি তথ্য সম্পাদনা করতে চাইছে, এবং Tuple

কখনও না বল না. এখানে কিছুটা শক্তিশালী।
জননী

47

আর একটি বিকল্প যা কাস্টম মডেল তৈরি করার প্রয়োজন নেই তা হ'ল একটি টিপল <> ব্যবহার করা ।

@model Tuple<Person,Order>

এটি অ্যান্ডির উত্তর অনুসারে একটি নতুন শ্রেণি তৈরি করার মতো পরিষ্কার নয়, তবে এটি কার্যকর।


এমভিসি 3 এ এটি ত্রুটি দেয় কেবল একটি ফাইলটিতে একটি 'মডেল' বিবৃতি অনুমোদিত। কোন সমাধান কীভাবে সমাধান করবেন?
গিব্বোক

4
@ গিব্বোক - আমি এমভিসি 3 এ এটি খুব ভাল ব্যবহার করছি। আপনার দুটি পৃথক @modelলাইন নেই তা নিশ্চিত করুন ?
ববসন

4
আপনি প্রতিটি মডেলের বৈশিষ্ট্যগুলি সাথে পেতে পারেন: এবং যথাক্রমে @Model.Item1.Propertyএবং এর @Model.Item2.Propertyজন্যPersonOrder
ব্যবহারকারী ২০১95৫৫৫

4
আমি আমার ভিউতে টুপল ব্যবহার করেছি। তবে, আমি আমার নিয়ামকটিতে মডেল মান পেতে সক্ষম হই না। তবে, আমি @ অ্যান্ডি প্রস্তাবিত হিসাবে প্যারেন্ট ভিউ মডেলটি ব্যবহার করার সময়, আমি আমার নিয়ামকটিতে মডেলটির মান পেয়েছি।
নরেন

4
@ স্টেফেনমিউকে - হুম আমি কখনই তা বিবেচনা করিনি, তবে আপনি ঠিক বলেছেন। অ্যান্ড্রুয়ের উত্তর হ'ল আরও একটি সাধারণ কারণ যা সাধারণ উদ্দেশ্য purpose যখন আপনি একটি হালকা ওজন বিকল্প (এই মত) সঙ্গে যেতে, আপনি কি কার্যকারিতা ছেড়ে দিতে হবে।
ববসন

10

আপনি যদি খুব ফ্ল্যাট মডেল রাখার ভক্ত হন তবে কেবল ভিউ সমর্থন করার জন্য, আপনার এই বিশেষ দৃশ্যে নির্দিষ্ট একটি মডেল তৈরি করা উচিত ...

public class EditViewModel
    public int PersonID { get; set; }
    public string PersonName { get; set; }
    public int OrderID { get; set; }
    public int TotalSum { get; set; }
}

অনেক লোক অটোম্যাপার ব্যবহার করে তাদের ডোমেন অবজেক্ট থেকে তাদের ফ্ল্যাট দর্শনগুলিতে মানচিত্র করতে পারেন।

ভিউ মডেলটির ধারণাটি হ'ল এটি কেবলমাত্র দৃষ্টিভঙ্গিকে সমর্থন করে - অন্য কিছু নয়। আপনার কেবলমাত্র দেখার জন্য প্রয়োজনীয় যা রয়েছে তা নিশ্চিত করার জন্য আপনার প্রতি ভিউ রয়েছে - আপনি অন্যান্য দর্শনগুলির জন্য চান এমন সম্পত্তিগুলির বোঝা নয়।


5

ঠিক আছে, প্রত্যেকে বোধগম্য হচ্ছে এবং আমি সমস্ত টুকরোগুলি নিয়েছি এবং আমার মতো নতুন বৌদের সাহায্য করতে এখানে এগুলি রেখেছি যার ব্যাখ্যা শেষ করা দরকার।

@ অ্যান্ড্রুয়ের উত্তর অনুসারে আপনি আপনার বড় শ্রেণি তৈরি করেছেন যা ২ টি ক্লাস ধারণ করে।

public class teamBoards{
    public Boards Boards{get; set;}
    public Team Team{get; set;}
}

তারপরে আপনার নিয়ামকটিতে আপনি 2 টি মডেল পূরণ করুন। কখনও কখনও আপনার কেবল একটি পূরণ করতে হবে। তারপরে বিনিময়ে আপনি বড় মডেলটি উল্লেখ করেছেন এবং এটি এর সাথে 2 টি ভিউতে নিয়ে যাবে।

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

 return View(teamBoards);

ভিউ শীর্ষে

@model yourNamespace.Models.teamBoards

তারপরে আপনার ইনপুটগুলি বা বড় মডেলের সামগ্রীগুলি উল্লেখ করে প্রদর্শনগুলি লোড করুন:

 @Html.EditorFor(m => Model.Board.yourField)
 @Html.ValidationMessageFor(m => Model.Board.yourField, "", new { @class = "text-danger-yellow" })

 @Html.EditorFor(m => Model.Team.yourField)
 @Html.ValidationMessageFor(m => Model.Team.yourField, "", new { @class = "text-danger-yellow" })

এবং. । । .ব্যাঞ্চে ফিরে আসার পরে, পোস্টটি আসার পরে, বিগ ক্লাসটি উল্লেখ করুন:

 public ActionResult ContactNewspaper(teamBoards teamboards)

এবং মডেল (গুলি) কী ফিরে এসেছে তা ব্যবহার করুন:

string yourVariable = teamboards.Team.yourField;

সম্ভবত ক্লাসে কিছু ডেটা অ্যানোটেশন বৈধকরণ স্টাফ রয়েছে এবং সেভ / এডিট ব্লকের শীর্ষে যদি (মডেলস্টেট.আইসভালিড) রাখে তবে। । ।


4

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

কর্মচারীকে উদাহরণ মডেল হিসাবে ব্যবহার করা:

@model Employee

আসলে এর মতো চিকিত্সা করা হয়।

@{ var Model = ViewBag.model as Employee; }

সুতরাং ভিউ (কর্মচারী) পদ্ধতিটি আপনার মডেলটি ভিউব্যাগে সেট করছে এবং তারপরে ভিউজাইন এটি কাস্ট করছে।

এই যে মানে,

ViewBag.departments = GetListOfDepartments();
    return View(employee);

যেমন ব্যবহার করা যেতে পারে,

            @model  Employee
        @{
                var DepartmentModel = ViewBag.departments as List<Department>;
        }

মূলত, আপনি আপনার ভিউব্যাগের যা কিছু আছে তা "মডেল" হিসাবে ব্যবহার করতে পারেন কারণ এটি যেভাবেই চলতে পারে। আমি বলছি না যে এটি আর্কিটেকচারালি আদর্শ, তবে এটি সম্ভব।


3

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

ব্যক্তিগতভাবে আমি এগুলিকে কেবল একটি মডেলের সাথে যুক্ত করতে চাইব তবে আমি এটির মতো করে থাকব:

public class xViewModel
{
    public int PersonID { get; set; }
    public string PersonName { get; set; }
    public int OrderID { get; set; }
    public int TotalSum { get; set; }
}

@model project.Models.Home.xViewModel

@using(Html.BeginForm())
{
    @Html.EditorFor(x => x.PersonID)
    @Html.EditorFor(x => x.PersonName)
    @Html.EditorFor(x => x.OrderID)
    @Html.EditorFor(x => x.TotalSum)
}

1

আপনি উপস্থাপনা প্যাটার্নটি ব্যবহার করতে পারেন http://martinfowler.com/eaaDev/PiversityationModel.html

এই উপস্থাপনা "দেখুন" মডেলটিতে ব্যক্তি এবং অর্ডার উভয়ই থাকতে পারে, এই নতুন
বর্গটি আপনার দর্শন উল্লেখের মডেল হতে পারে।


4
উপস্থাপনা মডেলটিতে আসলে প্রয়োজনীয় ডেটা থাকা উচিত যা কোনও ব্যক্তি এবং একটি অর্ডার থেকে উত্পন্ন হতে পারে। এতে সত্যই ব্যক্তি বা অর্ডার ডোমেন অবজেক্ট থাকা উচিত নয়। অন্তর্নিহিত ডোমেন থেকে দর্শনটি প্রদর্শনকে ডেস্পল করে।
ফেন্টন

0

আর কখনও যে বিষয়ে কথা হয় না তা হ'ল এমএসএসকিউএল-এ আপনি যে সমস্ত ডেটা উপস্থাপন করতে চান তার সাথে একটি ভিউ তৈরি করুন। তারপরে এসকিউএল বা মানচিত্রের জন্য লিনকুই ব্যবহার করুন। আপনার নিয়ামক এটিকে দর্শনে ফিরিয়ে দিন। সম্পন্ন.


0

আপনি এক দৃশ্য দুটি মডেল ঘোষণা করতে পারবে না, ব্যবহারের চেষ্টা Html.Action("Person", "[YourController]")Html.Action("Order", "[YourController]")

শুভকামনা।


এটি কি করে?
জননী

0

এএসপিএন-তে একটি দর্শন মডেলের পাশাপাশি আপনি একাধিক আংশিক দর্শন তৈরি করতে পারেন এবং প্রতিটি দৃশ্যে বিভিন্ন মডেল ভিউ বরাদ্দ করতে পারেন, উদাহরণস্বরূপ:

   @{
        Layout = null;
    }

    @model Person;

    <input type="text" asp-for="PersonID" />
    <input type="text" asp-for="PersonName" />

তারপরে অর্ডার মডেলের জন্য আরেকটি আংশিক দৃশ্য মডেল

    @{
        Layout = null;
     }

    @model Order;

    <input type="text" asp-for="OrderID" />
    <input type="text" asp-for="TotalSum" />

তারপরে আপনার মূল দৃশ্যে উভয় দ্বারা আংশিক দৃশ্য লোড করুন

<partial name="PersonPartialView" />
<partial name="OrderPartialView" />

-1

আমি আশা করি আপনি এটি সহায়ক!

আমি প্রকল্পের জন্য ভিউব্যাগ এবং টাস্কের জন্য মডেল ব্যবহার করি সুতরাং আমি একক দর্শন এবং নিয়ামক হিসাবে দুটি মডেল ব্যবহার করছি আমি ভিউব্যাগের মান বা ডেটা সংজ্ঞায়িত করেছি

List<tblproject> Plist = new List<tblproject>();
            Plist = ps.getmanagerproject(c, id);

            ViewBag.projectList = Plist.Select(x => new SelectListItem
            {
                Value = x.ProjectId.ToString(),
                Text = x.Title
            });

এবং tbltask এবং প্রকল্পের তালিকাতে আমার দুটি ভিন্ন মডেল

@

IEnumerable<SelectListItem> plist = ViewBag.projectList;

} @ মডেল তালিকা

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