বিভিন্ন ফোল্ডার থেকে আংশিক রেন্ডার (ভাগ করা হয়নি)


256

আমি কীভাবে অন্য একটি ফোল্ডার থেকে আংশিক (ব্যবহারকারী নিয়ন্ত্রণ) উপস্থাপনা করতে পারি? পূর্বরূপ 3 সহ আমি সম্পূর্ণ পথ দিয়ে রেন্ডারউজারকন্ট্রোল কল করতাম, তবে 5 এর পূর্বরূপে আপগ্রেড করা এটি আর সম্ভব নয়। পরিবর্তে আমরা রেন্ডার পার্টিশিয়াল পদ্ধতিটি পেয়েছি, তবে এটি আমাকে যে কার্যকারিতাটি সন্ধান করছে তা আমাকে দিচ্ছে না।

উত্তর:


443

ফাইল এক্সটেনশান সহ কেবল দেখার পথটি অন্তর্ভুক্ত করুন।

রাজো:

@Html.Partial("~/Views/AnotherFolder/Messages.cshtml", ViewData.Model.Successes)

এএসপি.এনইটি ইঞ্জিন:

<% Html.RenderPartial("~/Views/AnotherFolder/Messages.ascx", ViewData.Model.Successes); %>

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


19
আমি আশা করি আমরা কেবল / অন্য ফোল্ডার / বার্তাগুলি বলতে পারতাম
সাইমন_উইভার

4
@ সিমন_উইভার আপনি এটি অর্জন করতে পারেন। একটি উপায় হ'ল ভিউজাইনকে সংশোধন করা এবং এর FindPartialViewপদ্ধতিটি এমন কিছু দিয়ে ওভাররাইড করা হবেif(partialViewName.Contains"/")partialViewName="~/Views/"+partialViewName;
অ্যারনিস ল্যাপসা

2
এমভিসি 3 রেজার ইঞ্জিনেও কাজ করে তবে উপরের মতো আপনারও এক্সটেনশন (.cshtml) দরকার।
ক্রিস

যদি এর থেকে আলাদা হয় তবে আপনাকে "~ / অঞ্চল / টেস্টআরিয়া / দর্শন / ভাগ / ভাগাঙ্ক্ষিত / _সাম্প পার্টিয়াল.মোবাইল.সি.এস.টি.এম.এল."
সন্দীপ তালাথুলদুল

আপনি কীভাবে সেই আংশিক দৃশ্যের বিভিন্ন সংস্কৃতি পরিচালনা করতে পারেন (উদাহরণস্বরূপ ~ / ভিউস / আড্ডারফোল্ডার / বার্তাগুলি / বার্তা।
জাসদেফার

29

আমার ক্ষেত্রে আমি এমভিসিমেলার (https://github.com/smsohan/MvcMailer) ব্যবহার করছিলাম এবং অন্য ফোল্ডার থেকে আংশিক দৃশ্য অ্যাক্সেস করতে চেয়েছিলাম, এটি "ভাগ করা" ছিল না। উপরের সমাধানগুলি কাজ করে না, তবে একটি আপেক্ষিক পথ ব্যবহার করে।

@Html.Partial("../MyViewFolder/Partials/_PartialView", Model.MyObject)

একইভাবে ভাগ করা ফোল্ডারটি ব্যবহার করার জন্য @ এইচটিএমএল. পার্টিয়াল ("../ শেয়ার্ড /_প্রিয়ালিভিউ")
কার্টিস ইয়ালাপ

11
আমি সন্ধান করছি যে এটি শেষে .cshtml এক্সটেনশন ছাড়া কাজ করে না।
লুক

28

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

আপনার মডেল ফোল্ডারে একটি ক্লাস যুক্ত করুন:

public class NewViewEngine : RazorViewEngine {

   private static readonly string[] NEW_PARTIAL_VIEW_FORMATS = new[] {
      "~/Views/Foo/{0}.cshtml",
      "~/Views/Shared/Bar/{0}.cshtml"
   };

   public NewViewEngine() {
      // Keep existing locations in sync
      base.PartialViewLocationFormats = base.PartialViewLocationFormats.Union(NEW_PARTIAL_VIEW_FORMATS).ToArray();
   }
}

তারপরে আপনার Global.asax.cs ফাইলে নিম্নলিখিত লাইনটি যুক্ত করুন:

ViewEngines.Engines.Add(new NewViewEngine());

6
অবশ্যই বুঝতে পারি এই প্রশ্নটি অনেক আগে জিজ্ঞাসা করা হয়েছিল। ভেবেছিলাম ভবিষ্যতে গুগলারের এবং ভবিষ্যতের বাইনজারদের জন্য আমি এতে যুক্ত করব।
পৌল

- নেট কোর 2.2 তে কাজ করবে না, কারণ রেজারভিউজিনি। পার্টিয়ালভিউ লোকেশন ফর্ম্যাটগুলি বিদ্যমান নেই।
ডেমিয়ান বেরিসফোর্ড-মেইনার্ড

7

ভিউ / অ্যাকাউন্ট ফোল্ডারে অবস্থিত আমার পার্টিয়াল.অ্যাসেক্স নামের একটি ব্যবহারকারী নিয়ন্ত্রণের জন্য এইভাবে লিখুন:

<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>

5

আমি এমন একটি ভারসাম্য তৈরি করেছি যা মনে হচ্ছে বেশ ভালভাবে কাজ করছে। আমি ক্রিয়া নাম অনুসন্ধান, দেখার জন্য ইত্যাদি জন্য আলাদা নিয়ামকের প্রসঙ্গে স্যুইচ করার প্রয়োজনীয়তা পেয়েছি এটি বাস্তবায়নের জন্য, আমি এর জন্য একটি নতুন এক্সটেনশন পদ্ধতি তৈরি করেছি HtmlHelper:

public static IDisposable ControllerContextRegion(
    this HtmlHelper html, 
    string controllerName)
{
    return new ControllerContextRegion(html.ViewContext.RouteData, controllerName);
}

ControllerContextRegion হিসাবে সংজ্ঞায়িত করা হয়:

internal class ControllerContextRegion : IDisposable
{
    private readonly RouteData routeData;
    private readonly string previousControllerName;

    public ControllerContextRegion(RouteData routeData, string controllerName)
    {
        this.routeData = routeData;
        this.previousControllerName = routeData.GetRequiredString("controller");
        this.SetControllerName(controllerName);
    }

    public void Dispose()
    {
        this.SetControllerName(this.previousControllerName);
    }

    private void SetControllerName(string controllerName)
    {
        this.routeData.Values["controller"] = controllerName;
    }
}

ভিউয়ের মধ্যে এটি যেভাবে ব্যবহৃত হয় তা নিম্নরূপ:

@using (Html.ControllerContextRegion("Foo")) {
    // Html.Action, Html.Partial, etc. now looks things up as though
    // FooController was our controller.
}

এর জন্য অযাচিত পার্শ্ব প্রতিক্রিয়া থাকতে পারে যদি আপনার কোডটির জন্য controllerরুট উপাদানটি পরিবর্তন না করা প্রয়োজন তবে আমাদের কোডটিতে এখন পর্যন্ত এই পদ্ধতির কোনও নেতিবাচক বলে মনে হচ্ছে না।


4

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

আমি লক্ষ্য করেছি যে আপনার উদাহরণগুলি "~ / অ্যাকাউন্ট / মাইপারটিয়াল.অ্যাক্সেক্স" পাথটি ব্যবহার করে তবে আপনি উল্লেখ করেছেন যে আপনার ব্যবহারকারীর নিয়ন্ত্রণ ভিউ / অ্যাকাউন্ট ফোল্ডারে রয়েছে। আপনি চেষ্টা করেছেন?

<%Html.RenderPartial("~/Views/Account/myPartial.ascx");%>

বা এটি কি আপনার প্রশ্নের মধ্যে একটি টাইপো?


3

পাঠকদের জন্য ASP.NET কোর 2.1 বা তার পরে এবং আংশিক ট্যাগ হেল্পার সিন্ট্যাক্স ব্যবহার করতে চাইলে এটি চেষ্টা করুন:

<partial name="~/Views/Folder/_PartialName.cshtml" />

টিলড (~) isচ্ছিক।

Https://docs.microsoft.com/en-us/aspnet/core/mvc/views/partial?view=aspnetcore-3.1#partial-tag-helper এর তথ্যও সহায়ক।


0

আপনার এটি চেষ্টা করা উচিত

~/Views/Shared/parts/UMFview.ascx

স্থান ~/Views/আপনার কোড সামনে


0

একটি কাস্টম ভিউ ইঞ্জিন তৈরি করুন এবং একটি পদ্ধতি যা একটি ViewEngineResult ফেরত দেয় এই উদাহরণে আপনি কেবল ওভাররাইট করে _options.ViewLocationFormatsআপনার ফোল্ডার ডিরেক্টরিটি যুক্ত করুন:

public ViewEngineResult FindView(ActionContext context, string viewName, bool isMainPage)
        {
            var controllerName = context.GetNormalizedRouteValue(CONTROLLER_KEY);
            var areaName = context.GetNormalizedRouteValue(AREA_KEY);

            var checkedLocations = new List<string>();
            foreach (var location in _options.ViewLocationFormats)
            {
                var view = string.Format(location, viewName, controllerName);
                if (File.Exists(view))
                {
                    return ViewEngineResult.Found("Default", new View(view, _ViewRendering));
                }
                checkedLocations.Add(view);
            }

            return ViewEngineResult.NotFound(viewName, checkedLocations);
        }

উদাহরণ: https://github.com/AspNetMonsters/pugzor


-5

ব্যবহার করার চেষ্টা করুন RenderAction("myPartial","Account");


3
দয়া করে প্রশ্নটি পড়ুন কারণ ব্যবহারকারী আপনার কোডের ফোল্ডারটি বিভিন্ন ফোল্ডারে দেখার বিষয়ে জিজ্ঞাসা করছে?
পামমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.