Farklı klasörden kısmi oluşturma (paylaşılmadı)


256

Bir görünümün farklı bir klasörden kısmi (kullanıcı denetimi) oluşturmasını nasıl sağlayabilirim? Önizleme 3 ile RenderUserControl'u tam yolla çağırırdım, ancak önizleme 5'e yükseltme yaparken bu artık mümkün değil. Bunun yerine RenderPartial yöntemini aldık, ancak aradığım işlevselliği sunmuyor.

Yanıtlar:


443

Sadece dosya uzantısını içeren görünüm yolunu ekleyin.

Ustura:

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

ASP.NET motoru:

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

Sorununuz bu değilse, lütfen RenderUserControl ile çalışan kodunuzu ekler misiniz?


19
Keşke sadece söyleyebiliriz / AnotherFolder / Mesajlar
Simon_Weaver

4
@Simon_Weaver Bunu başarabilirsiniz. Bunun bir yolu ViewEngine'i değiştirmek ve FindPartialViewyöntemini böyle bir şeyle geçersiz if(partialViewName.Contains"/")partialViewName="~/Views/"+partialViewName;
kılmaktır

2
MVC 3 Razor motorunda da çalışır, ancak yukarıdaki gibi, uzantıya (.cshtml) ihtiyacınız vardır.
Chris

Eğer farklı ise "~ / Areas / TestArea / Views / Shared / _SomePartial.mobile.cshtml" yolunu vermeniz gerekir
sandeep talabathula

Bu kısmi görünümün farklı kültürlerini nasıl ele alırsınız (örneğin ~ / Views / AnotherFolder / Messages.en.cshtml)?
jasdefer

29

Benim durumumda MvcMailer (https://github.com/smsohan/MvcMailer) kullanıyordum ve "Paylaşılan" bölümünde olmayan başka bir klasörden kısmi bir görünüme erişmek istedim. Yukarıdaki çözümler işe yaramadı, ancak göreceli bir yol kullanmak işe yaradı.

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

Benzer şekilde @ Html.Partial ("../ Shared / _PartialView") Paylaşılan klasörü kullanmak için.
Curtis Yallop

11
Bunun sonunda .cshtml uzantısı olmadan çalışmadığını görüyorum.
Luke

28

Bu başka yolu çok sık kullanıyorsanız, yolu her zaman belirtmek zorunda kalmadan kalıcı olarak düzeltebilirsiniz. Varsayılan olarak, Görünüm klasöründe ve Paylaşılan klasörde kısmi görünümleri denetler. Ama bir tane eklemek istediğinizi söyleyin.

Modeller klasörünüze bir sınıf ekleyin:

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

Ardından Global.asax.cs dosyanıza aşağıdaki satırı ekleyin:

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

6
Elbette bu sorunun uzun zaman önce sorulduğunu fark ettim. Gelecekteki Google çalışanları ve gelecekteki Bingers için ekleyeceğimi düşündüm.
Paul

- RazorViewEngine.PartialViewLocationFormats mevcut olmadığından .Net Core 2.2'de çalışmaz.
Demian Berisford-Maynard

7

Views / Account klasöründe bulunan myPartial.ascx adlı bir kullanıcı denetimi için şöyle yazın:

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

5

Oldukça iyi işleyen bir geçici çözüm oluşturdum. Eylem adı arama, görünüm arama vb. İçin farklı bir denetleyicinin bağlamına geçme ihtiyacını buldum. Bunu uygulamak için aşağıdakiler için yeni bir uzantı yöntemi oluşturdum HtmlHelper:

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

ControllerContextRegion olarak tanımlanır:

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;
    }
}

Bunun bir görünüm içinde kullanılma şekli şöyledir:

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

Kodunuz controllerrota bileşeninin değişmesini gerektiriyorsa bunun için istenmeyen yan etkiler olabilir , ancak şu ana kadar kodumuzda bu yaklaşım için herhangi bir olumsuzluk görünmemektedir.


4

WebFormsViewEngine'ın dayandığı VirtualPathProviderViewEngine, yolun önündeki "~" ve "/" karakterlerini desteklemesi ve bu nedenle yukarıdaki örneklerin çalışması gerekir.

Örneklerinizin "~ / Account / myPartial.ascx" yolunu kullandığını fark ettim, ancak kullanıcı kontrolünüzün Views / Account klasöründe bulunduğunu belirttiniz. Denedin mi

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

ya da bu sadece sorunuzdaki bir yazım hatası mı?



0

bunu denemelisin

~/Views/Shared/parts/UMFview.ascx

~/Views/kodundan önce yerleştir


0

Özel bir Görünüm Altyapısı oluşturun ve bir ViewEngineResult döndüren bir yönteme sahip olun Bu örnekte _options.ViewLocationFormats, klasör dizininizin üzerine yazıp ekleyin:

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

Örnek: https://github.com/AspNetMonsters/pugzor


-5

Kullanmayı deneyin RenderAction("myPartial","Account");


3
Kullanıcı farklı klasörde görünüm hakkında kod sorurken soruyu okuyun.
Pamma
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.