আমি কীভাবে এএসপি.নেট এমভিসি 3 রেজার ভিউস্টার্ট ফাইলটিতে বিভিন্ন লেআউটগুলি নির্দিষ্ট করব?


313

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

সরলতার জন্য বলতে দিন যে এগুলির প্রতিটি সাইটের জন্য সমস্ত যুক্তি সুস্পষ্টভাবে 2 স্বতন্ত্র নিয়ামকগুলিতে আবৃত।

  • PublicController
  • StaffController

এবং তাদের প্রত্যেকের প্রত্যেকের অধীনে সমস্ত দৃশ্যের জন্য একই লেআউট রয়েছে have

  • _PublicLayout.cshtml
  • _StaffLayout.cshtml

"সার্বজনীন" এর অধীনে সমস্ত ভিউ / অ্যাকশন পাবলিক লেআউট এবং "স্টাফ" এর অধীনে থাকা সমস্ত কিছু স্টাফ লেআউট ব্যবহার করে তা নির্দিষ্ট করতে আমি কীভাবে _ভিউস্টার্ট.কোশটিএমএল ফাইলটি ব্যবহার করব?

ধন্যবাদ!


4
কেবলমাত্র ক্ষেত্রে: আপনি যদি একটি প্রদত্ত Razorদর্শনের জন্য লেআউটটি সরাতে চান তবে ঠিক সেট করুনLayout = null;
লেনিয়েল ম্যাকাফেরি

3
আপনার উদাহরণের মতামত হিসাবে আপনার সম্ভবত পাবলিক এবং স্টাফ নামের কন্ট্রোলার না থাকা উচিত। নিয়ামকরা প্রায়শই ইভেন্ট কন্ট্রোলার, ইউজারকন্ট্রোলার, বা এর মতো নির্দিষ্ট কী ব্যবসায়িক প্রতিষ্ঠানের CRUD- এর মতো ক্রিয়ায় প্রবেশের পয়েন্ট হিসাবে প্রয়োগ করা হয়। যদি আপনার অ্যাপ্লিকেশনটি যুক্তিসঙ্গতভাবে বড় হয়, তবে পাবলিক / স্টাফ কন্ট্রোলারের দায়িত্ব বিস্তৃত হবে। পরিবর্তে অঞ্চলগুলি বিবেচনা করুন। msdn.microsoft.com/en-us/library/ee671793%28VS.100%29.aspx আপনি এই সম্পর্কে সচেতন হতে পারেন তবে এটি পড়ার অন্য কেউ ভুল ধারণা পেতে পারে, তাই কেবল রেকর্ডের জন্য।
অ্যালেক্স

উত্তর:


558

আপনি ফোল্ডারের _ViewStart.cshtmlভিতরে এমন একটি ফাইল রাখতে পারেন /Views/Publicযা ফোল্ডারে ডিফল্টটিকে ওভাররাইড করে /Viewsএবং পছন্দসই বিন্যাসটি নির্দিষ্ট করতে পারে:

@{
    Layout = "~/Views/Shared/_PublicLayout.cshtml";
}

সাদৃশ্য দ্বারা আপনি ফোল্ডারের _ViewStart.cshtmlভিতরে অন্য ফাইলটি এতে রাখতে পারেন /Views/Staff:

@{
    Layout = "~/Views/Shared/_StaffLayout.cshtml";
}

আপনি নিয়ামক ক্রিয়াকলাপের মধ্যে কোনও ভিউ ফেরত দেওয়ার সময় কোন লেআউটটি ব্যবহার করা উচিত তাও নির্দিষ্ট করতে পারেন তবে এটি প্রতি ক্রিয়াকলাপ:

return View("Index", "~/Views/Shared/_StaffLayout.cshtml", someViewModel);

তবুও আরেকটি সম্ভাবনা হ'ল একটি কাস্টম অ্যাকশন ফিল্টার যা লেআউটটিকে ওভাররাইড করে। এটি অর্জনের জন্য আপনি অনেকগুলি সম্ভাবনা দেখতে পাচ্ছেন। আপনার দৃশ্যে কোনটি সবচেয়ে উপযুক্ত ফিট করে তা বেছে নেওয়া আপনার।


হালনাগাদ:

মতামত বিভাগে অনুরোধ হিসাবে এখানে একটি অ্যাকশন ফিল্টার একটি উদাহরণ যা একটি মাস্টার পৃষ্ঠা চয়ন করবে:

public class LayoutInjecterAttribute : ActionFilterAttribute
{
    private readonly string _masterName;
    public LayoutInjecterAttribute(string masterName)
    {
        _masterName = masterName;
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        base.OnActionExecuted(filterContext);
        var result = filterContext.Result as ViewResult;
        if (result != null)
        {
            result.MasterName = _masterName;
        }
    }
}

এবং তারপরে আপনি চান লেআউটটি নির্দিষ্ট করে এই কাস্টম বৈশিষ্ট্য সহ একটি নিয়ামক বা একটি ক্রিয়া সাজান:

[LayoutInjecter("_PublicLayout")]
public ActionResult Index()
{
    return View();
}

1
@DarinDimitrov আমি কোথায় তৈরি করবে LayoutInjecterAttribute। ? কোন নির্দিষ্ট অবস্থান আছে?
কেবিভিশনু

2
@ ভিকিবি, আপনি এটি একটি ActionFiltersসাব-ফোল্ডারের ভিতরে রাখতে পারেন ।
দারিন দিমিত্রভ

এর সাথে একটি সম্ভাব্য সমস্যা LayoutInjecterAttribute: এটি নিয়ামকের পদ্ধতির আগে বলা হয় OnException। সুতরাং, যদি নিয়ামক ব্যতিক্রম হ্যান্ডলিংয়ের সময় কোনও ফলাফলের ফলাফল সরবরাহ করে তবে বিন্যাসটি সেট করা হবে না।
জেফ শার্প

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

29

আরও একটি পদ্ধতি হ'ল অভ্যন্তরের বিন্যাসটিকে সংজ্ঞায়িত করা:

   @{
    Layout = "~/Views/Shared/_MyAdminLayout.cshtml";
    }

করার আরও উপায়, এখানে পাওয়া যাবে আশা করি এটি কারও সাহায্য করবে।


1
এটি কাজ করবে না - পৃথক _ভিউ স্টার্ট.কোচটিএমএল ছাড়া আপনার ভিউটি অন্য লেআউটে @ রেন্ডারবডি () পদ্ধতির অভ্যন্তরে রেন্ডার হবে।
Tillman32

এই! আপনারা যা করার দরকার তা হ'ল সবাই কেন এই অত্যন্ত জটিল প্রক্রিয়াগুলি এগিয়ে দিচ্ছে!
জর্জ হার্নওয়েল

15

আপনার ASP.NET MVC অ্যাপ্লিকেশনে লেআউটগুলি রেন্ডারিং নিয়ন্ত্রণের জন্য প্রাথমিক পদ্ধতিটি এই পদ্ধতি। আমরা নিয়ামকটি সনাক্ত করতে পারি এবং লেআউটগুলিকে সমান নিয়ামক হিসাবে রেন্ডার করতে পারি, এটি করার জন্য আমরা ভিউজের ফোল্ডারের মূল ডিরেক্টরিতে _ভিস্টার্ট ফাইলটিতে আমাদের কোডটি লিখতে পারি। নিম্নলিখিতটি কীভাবে এটি করা যেতে পারে তা উদাহরণ দেখায়।

@{
    var controller = HttpContext.Current.Request.RequestContext.RouteData.Values["Controller"].ToString();
    string cLayout = "";

    if (controller == "Webmaster")
        cLayout = "~/Views/Shared/_WebmasterLayout.cshtml";
    else
        cLayout = "~/Views/Shared/_Layout.cshtml";

    Layout = cLayout;
}

এখানে সম্পূর্ণ নিবন্ধটি পড়ুন "এএসপি.নেট এমভিসিতে বিভিন্ন লেআউট কীভাবে রেন্ডার করবেন"

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