Ben benzer bir çok kiracı görünümü motoru uyguladık: me gibi görünüm için arama yerleri geçersiz izinTaşıma Düzeni özellikleri
Bu: %1
aktif kiracı için doğru klasörü ile ikame edildiği
MasterLocationFormats = new[]
{
"~/Views/%1/{1}/{0}.cshtml",
"~/Views/%1/Shared/{0}.cshtml",
"~/Views/Default/{1}/{0}.cshtml",
"~/Views/Default/Shared/{0}.cshtml",
};
. Bu sadece bir istisna dışında bir sorun çalışıyor. Bu gibi benim görünümünde Düzen yolunu tanımlarken:
Layout = "~/Views/Default/Shared/_MyLyout.cshtml";
Biraz sert koduna düzen sayfasının tam yerini beri çok kullanıcılı olma olması amacı yendi.
Ben kiracı onların bir düzen sayfalarını sahip olmasına izin isteseydiLayout = "~/Views/%1/Shared/_MyLyout.cshtml";
, bunu nasıl destek hakkında giderdim: Böyle bir şey yapmak mümkün istiyorum?
ben overrode görünümü motoru yöntemleriyle kurcalıyor denedi:
- CreatePartialView
- CreateView
- FileExists
Ama hiçbir şey dinamik belirtmek mümkün olma yolunda kendini işaret ediyor düzen sayfası.
Güncelleme:
İşte ben bugüne kadar çalışma var zaten. Bu sorunun cevabı biraz HTML yardımcı oluşturmak için modifiye https://stackoverflow.com/a/9288455/292578 kullandı: Saravanan önerdi benzer
public static string GetLayoutPageForTenant(this HtmlHelper html, string LayoutPageName)
{
var layoutLocationFormats = new[]
{
"~/Views/{2}/{1}/{0}.cshtml",
"~/Views/{2}/Shared/{0}.cshtml",
"~/Views/Default/{1}/{0}.cshtml",
"~/Views/Default/Shared/{0}.cshtml",
};
var controller = html.ViewContext.Controller as MultiTenantController;
if(controller != null)
{
var tenantName = controller.GetTenantSchema();
var controllerName = html.ViewContext.RouteData.Values["Controller"].ToString();
foreach(var item in layoutLocationFormats)
{
var resolveLayoutUrl = string.Format(item, LayoutPageName, controllerName, tenantName);
var fullLayoutPath = HostingEnvironment.IsHosted ? HostingEnvironment.MapPath(resolveLayoutUrl) : System.IO.Path.GetFullPath(resolveLayoutUrl);
if(File.Exists(fullLayoutPath)) return resolveLayoutUrl;
}
}
throw new Exception("Page not found.");
}
. Sonra bu kodla Bence düzenini ayarlayabilirsiniz:
Layout = Html.GetLayoutPageForTenant("_Home");
Maalesef bu gitmek için yanlış bir yol gibi görünüyor özel görünüm motoru yapıyor işi çoğaltır.
Bu yaklaşımda sahip olduğum tek sorun, her kiracının kendi özel düzen sayfalarına sahip olmamasıdır. Özel bir mizanpaj sayfası bulunmazsa, aramanın hala Varsayılan klasöre varsayılan olmasını istiyorum. – Sparafusile
@Sparafusile: Bu durumda, ViewBag'da bir geri dönüş kimliğine sahip olabiliriz. Yani, Contoller'da, kiracının özel bir mizanpaj sayfası olup olmadığını kontrol edeceğiz, eğer öyleyse bu klasörü görüntüleme çantasına koyacağız, yoksa kiracının klasör adını ayarlayacağız. 'ViewBag.TenantFolderName =" defaultPath "; (Kiracı özelleştiricisi var ise) { ViewBag.TenantFolderName = tenantFolderName; } IMHO, bu hataya karşı güvenli olacaktır. – Saravanan
Bunun işe yarayabileceğini kabul etsem de, denetleyicideki tüm işleri yapmak için özel görüntü motorunun amacını bozguna uğratır. Daha zarif bir çözüm aramaya devam edeceğim. – Sparafusile