এএসপি.নেট এমভিসিতে মাস্টার পৃষ্ঠায় ডেটা পাঠানো


102

এমভিসি নিয়ম ভঙ্গ না করে মাস্টার পৃষ্ঠায় (এএসপি.নেট এমভিসি ব্যবহার করে) ডেটা পাস করার আপনার উপায় কী?

ব্যক্তিগতভাবে, আমি অ্যাবস্ট্রাক্ট কন্ট্রোলার (বেস কন্ট্রোলার) বা বেস ক্লাস কোডটি পছন্দ করি যা সমস্ত দর্শনগুলিতে পাস করা হয়।


1
আমি কীভাবে এটি পরিচালনা করেছি সে সম্পর্কে আমি একটি গাইড লিখেছিলাম: ব্রিটিশডিভলপার.কম.উইক / ২০০০ / 06 /… সহায়তা করা উচিত
ব্রিটিশ ডেভেলপার

উত্তর:


77

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

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

public class MasterViewData
{
    public ICollection<string> Navigation { get; set; }
}

সেই মাস্টার পৃষ্ঠাটি ব্যবহার করে প্রতিটি দর্শন একটি দৃ strongly়ভাবে টাইপ করা ভিউ ডেটা শ্রেণিতে লাগে যার তথ্য রয়েছে এবং মাস্টার পৃষ্ঠাগুলি থেকে প্রাপ্ত ডেটা দেখুন:

public class IndexViewData : MasterViewData
{
    public string Name { get; set; }
    public float Price { get; set; }
}

যেহেতু আমি চাই না যে পৃথক নিয়ামকরা মাস্টার পৃষ্ঠাগুলির ডেটা একসাথে রাখার বিষয়ে কিছু জানতে চান আমি সেই যুক্তিকে একটি কারখানায় আবদ্ধ করি যা প্রতিটি নিয়ামকের কাছে দেওয়া হয়:

public interface IViewDataFactory
{
    T Create<T>()
        where T : MasterViewData, new()
}

public class ProductController : Controller
{
    public ProductController(IViewDataFactory viewDataFactory)
    ...

    public ActionResult Index()
    {
        var viewData = viewDataFactory.Create<ProductViewData>();

        viewData.Name = "My product";
        viewData.Price = 9.95;

        return View("Index", viewData);
    }
}

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

public class IndexViewData : MasterViewData
{
    public string Name { get; set; }
    public float Price { get; set; }
    public SubViewData SubViewData { get; set; }
}

<% Html.RenderPartial("Sub", Model.SubViewData); %>

এটি কেবলমাত্র উদাহরণ কোড এবং এটি যেমনটি সংকলন করার উদ্দেশ্যে নয়। এএসপি. নেট এমভিসি 1.0 এর জন্য ডিজাইন করা।


4
এটি স্কট গুথেরির দ্বারা প্রস্তাবিত পদ্ধতি, তাই আমাকে সম্মত হতে হবে।
সাইমন ফক্স

@ সিমন ফক্স - স্কটগুর পরামর্শে একটি লিঙ্ক পেয়েছেন? এটি খুঁজে পেল না।
orp


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

5
আমি দৃ strongly়ভাবে টাইপ করা মডেলগুলির সাথে কাজ করতে চাই, তবে আমি আমার অন্যান্য সমস্ত মডেল এবং ক্রিয়াকলাপের সাথে মাস্টার ডেটা সংযুক্ত করার পক্ষে খুব বড় অনুরাগী নই। কিছুটা দেরিতে এই থ্রেডে ঝাঁপিয়ে পড়েছি, তবে আমি মাস্টার ডেটাতে আমার দৃষ্টিভঙ্গি পোস্ট করেছি যা জিনিসগুলিকে আরও আলগা রাখে।
টড মেনিয়ার

59

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

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

3
+1 টি। আর একটি সুবিধা হ'ল বর্তমান রানটাইম স্থিতির উপর নির্ভর করে আপনার একই মতামতটি বিভিন্ন মাস্টার পৃষ্ঠাগুলি ব্যবহার করতে পারে।
স্ট্রিপলিং ওয়ারিয়র

1
আমি এই উত্তরটি খুব পছন্দ করি - অন্য পদ্ধতির রূপরেখাগুলি কিছুটা জটিল বলে মনে হচ্ছে।
ধান

2
এটি আমার মতে সর্বাধিক মার্জিত সমাধান।
স্বায়ত্তশক্তি

1
এই সমাধানটি আমার কাছেও সেরা বলে মনে হচ্ছে। অসংখ্য ধন্যবাদ!
জিমডানিয়েল

1
এটি দুর্দান্ত উপায়, তবে মনে রাখবেন যে আপনাকে এখনও আপনার "আংশিক ক্রিয়া" এর জন্য রুটগুলি নির্দিষ্ট করতে হবে। এই উত্তরটি দেখুন stackoverflow.com/a/3553617/56621
অ্যালেক্স

20

সম্পাদনা

জেনেরিক ত্রুটি নীচে আরও ভাল উত্তর সরবরাহ করেছে। দয়া করে এটি পড়ুন!

আসল উত্তর

মাইক্রোসফ্ট আসলে একটি এন্ট্রি পোস্ট করেছে জন্য "অফিসিয়াল" উপায়ে । এটি তাদের যুক্তিগুলির ব্যাখ্যা সহ এক ধাপে ধাপে ওয়াক-থ্রু সরবরাহ করে।

সংক্ষেপে, তারা একটি বিমূর্ত কন্ট্রোলার ক্লাস ব্যবহার করার পরামর্শ দেয় তবে নিজের জন্য দেখুন।


ধন্যবাদ! সেই উদাহরণটি হ'ল হ'ল আমি যা করছি ... ডাটাবেস থেকে আগত প্রতিটি পৃষ্ঠায় বিভাগটি।
মার্টিন

এমভিসির অন্যতম লেখক স্কট গুথেরি নীচে @ জেনারিক ত্রুটির দ্বারা প্রদত্ত সমাধানের প্রস্তাব দিয়েছেন
সাইমন ফক্স

1
আপনার আনুষ্ঠানিকভাবে সঠিক এবং ওপি কর্তৃক উত্তর হিসাবে স্বীকৃত হয়েও সেরা উত্তরের দিকে পরিচালিত করার জন্য +1 1
ইসমাইলস

আপনার আনুষ্ঠানিকভাবে সঠিক এবং ওপি কর্তৃক উত্তর হিসাবে স্বীকৃত হয়েও সেরা উত্তরের দিকে পরিচালিত করার জন্য +1 1
ডেভ জেলিসন

আসলে, টড মেনিয়ার্স বর্তমানে এটির সেরা উত্তর।
andreialecu

7

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


3

2

আমি দেখতে পেয়েছি যে আপনি যে মডেল অবজেক্টে ভিউতে যাচ্ছেন তার একটি সাধারণ পিতামাতার ব্যতিক্রমী কার্যকর।

যে কোনওভাবেই পৃষ্ঠাগুলির মধ্যে কিছু সাধারণ মডেল বৈশিষ্ট্য থাকতে পারে।


0

অনুরোধ.প্যারামস অবজেক্টটি পরিবর্তনীয়। অনুরোধ প্রক্রিয়াকরণ চক্রের অংশ হিসাবে এটিতে স্কেলারের মান যুক্ত করা বেশ সহজ। দেখার দৃষ্টিকোণ থেকে, তথ্য কোয়েরিস্ট্রিং বা ফর্ম পোস্টে সরবরাহ করা যেতে পারে। HTH


0

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


0

অন্যান্য সমাধানগুলির কমনীয়তার ঘাটতি রয়েছে এবং এটি খুব বেশি সময় নেয়। আমি প্রায় পুরো বছর পরে এই অত্যন্ত দুঃখজনক এবং দরিদ্র কাজটি করার জন্য ক্ষমা চাইছি:

<script runat="server" type="text/C#">
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        MasterModel = SiteMasterViewData.Get(this.Context);
    }

    protected SiteMasterViewData MasterModel;
</script>

স্পষ্টতই আমার কাছে সাইটমাস্টারভিউ ডেটাতে এই স্থির পদ্ধতি গেট () রয়েছে যা সাইটমাস্টারভিউ ডেটা প্রত্যাবর্তন করে।


অনেকের জন্য এই একটি বিট হল hacky মনে হতে পারে বা 'অপবিত্র' কিন্তু এটি দ্রুত কাজ শেষ প্রীতির এ কেমন পায়
আহা

বিতৃষ্ণা। আপনার কোডটি বজায় রাখা আরও অনেক কঠিন বলে মনে হয় আপনি যদি এইচটিএমএল.রেন্ডার অ্যাকশন () ব্যবহার করেন।
ড্যান এস্পারজা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.