भिन्न फ़ोल्डर से रेंडर आंशिक (साझा नहीं)


256

मुझे एक अलग फ़ोल्डर से एक आंशिक (उपयोगकर्ता नियंत्रण) रेंडर करने का दृश्य कैसे मिल सकता है? पूर्वावलोकन 3 के साथ मैं RenderUserControl को पूर्ण पथ के साथ कॉल करता था, लेकिन पूर्वावलोकन 5 में अपग्रेड करने के बाद यह अब संभव नहीं है। इसके बजाय हमें RenderPartial पद्धति मिली, लेकिन यह मुझे उस कार्यक्षमता की पेशकश नहीं कर रहा है जिसकी मुझे तलाश है।

जवाबों:


443

बस फ़ाइल एक्सटेंशन के साथ, दृश्य का पथ शामिल करें।

उस्तरा:

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

ASP.NET इंजन:

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

यदि वह आपकी समस्या नहीं है, तो क्या आप कृपया अपना कोड शामिल कर सकते हैं जो RenderUserControl के साथ काम करता था?


19
काश हम सब बस कह सकते हैं / AnotherFolder / संदेश
Simon_Weaver

4
@Simon_Weaver आप इसे प्राप्त कर सकते हैं। एक तरीका यह ViewEngine को संशोधित करने और यह ओवरराइड करने के लिए किया जाएगा FindPartialViewकी तरह कुछ के साथ विधिif(partialViewName.Contains"/")partialViewName="~/Views/"+partialViewName;
आर्निस Lapsa

2
MVC 3 रेजर इंजन में भी काम करता है, लेकिन ऊपर की तरह, आपको एक्सटेंशन (.cshtml) की आवश्यकता है।
क्रिस

यदि इसके अलग-अलग हैं तो आपको "~ / क्षेत्र / टेस्टअरे / दृश्य / साझा / _SomePartial.mobile.cshtml" पथ देने की आवश्यकता होगी
संदीप तालबाथुला

आप उस आंशिक दृश्य की विभिन्न संस्कृतियों को कैसे संभालते हैं (उदाहरण के लिए ~ / Views / AnotherFolder / Messages.en.cshtml)?
jasdefer

29

मेरे मामले में मैं MvcMailer (https://github.com/smsohan/MvcMailer) का उपयोग कर रहा था और एक अन्य फ़ोल्डर से आंशिक दृश्य का उपयोग करना चाहता था, जो "साझा" में नहीं था। उपरोक्त समाधान काम नहीं किया, लेकिन एक रिश्तेदार पथ का उपयोग किया।

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

इसी तरह @ Html.Partial ("../ साझा / _PartialView") साझा फ़ोल्डर का उपयोग करने के लिए।
कर्टिस यूलॉप

11
मुझे पता है कि यह अंत में .cshml एक्सटेंशन के बिना काम नहीं करता है।
ल्यूक

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
बेशक मुझे पता है कि यह सवाल बहुत पहले पूछा गया था। सोचा था कि मैं इसे भविष्य के Googlers और भविष्य के Bingers के लिए जोड़ूंगा।
पॉल

- .Net Core 2.2 में काम नहीं करेगा, क्योंकि RazorViewEngine.PartialViewLocationFormats मौजूद नहीं है।
डेमियन बेरिस्फोर्ड-मेनार्ड

7

उपयोगकर्ता नियंत्रण के लिए जिसका नाम myPartial.ascx है, जो दृश्य / खाता फ़ोल्डर में स्थित है, इस तरह लिखें:

<%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

VirtualPathProviderViewEngine, जिस पर WebFormsViewEngine आधारित है, पथ के सामने "~" और "/" वर्णों का समर्थन करने वाला है, इसलिए ऊपर दिए गए आपके उदाहरण काम करने चाहिए।

मैंने देखा कि आपके उदाहरण "~ / खाता / myPartial.ascx" पथ का उपयोग करते हैं, लेकिन आपने उल्लेख किया है कि आपका उपयोगकर्ता नियंत्रण दृश्य / खाता फ़ोल्डर में है। आपने कोशिश की है

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

या यह कि आपके प्रश्न में सिर्फ एक टाइपो है?


3

ASP.NET Core 2.1 का उपयोग करने वाले पाठकों के लिए या बाद में और आंशिक टैग सहायक सिंटैक्स का उपयोग करना चाहते हैं , इसके लिए प्रयास करें:

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

टिल्ड (~) वैकल्पिक है।

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
कृपया प्रश्न पढ़ें कि उपयोगकर्ता विभिन्न फ़ोल्डर में दृश्य के बारे में पूछ रहा है कि आपके कोड में फ़ोल्डर कहाँ है?
पम्मा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.