Я реализовал вид двигатель многопользовательского подобное тому, что описано здесь:Обработки макет свойство с видом на заказ Бритвы двигателя
которые позволяют мне переопределить места поиска для просмотра как это:
MasterLocationFormats = new[]
{
"~/Views/%1/{1}/{0}.cshtml",
"~/Views/%1/Shared/{0}.cshtml",
"~/Views/Default/{1}/{0}.cshtml",
"~/Views/Default/Shared/{0}.cshtml",
};
В котором %1
заменяется правильную папку для активного арендатора. Это работает только прекрасное исключение одной проблемы. Когда я определяю путь Layout на мой взгляд, как это:
Layout = "~/Views/Default/Shared/_MyLyout.cshtml";
Это своего рода поражения цели с мульти-договор аренды, так как я должен жестко закодировать точное расположение страницы макета. Я хочу быть в состоянии сделать что-то вроде этого:
Layout = "~/Views/%1/Shared/_MyLyout.cshtml";
Если бы я хотел, чтобы жильцы имеют один макет страницы, как бы я идти о поддержке этого?
Я попытался пустячным с методами вида двигателя, что я отменяю:
- CreatePartialView
- CreateView
- FileExists
Но ничто не кажется, чтобы указать себя в стороне возможности динамически определять страницы макета.
Update:
Вот что я работаю до сих пор. Я использовал ответ на этот вопрос https://stackoverflow.com/a/9288455/292578 слегка изменен, чтобы создать HTML-помощник:
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.");
}
, который похож на то, что предложил Saravanan. Тогда я могу установить макет, на мой взгляд с этим кодом:
Layout = Html.GetLayoutPageForTenant("_Home");
К сожалению, это дублирует работу, которая делает пользовательский вид двигателя, который, кажется, как неправильный путь.
Единственная проблема, с которой я сталкиваюсь, заключается не в том, что у каждого арендатора будут свои собственные страницы макета. Я по-прежнему хочу, чтобы поиск по умолчанию был папкой по умолчанию, если страница настраиваемого макета не найдена. – Sparafusile
@Sparafusile: В этом случае у нас может быть резервный идентификатор в ViewBag. Поэтому в Contoller мы проверим, есть ли у арендатора специальная страница макета, поэтому мы установим эту папку в сумке просмотра, иначе мы установим имя папки арендатора. 'ViewBag.TenantFolderName =" defaultPath "; if (арендатор имеет customFolder) { ViewBag.TenantFolderName = tenantFolderName; } ' ИМХО, это будет безотказно. – Saravanan
Хотя я согласен, что это может сработать, это своего рода поражение цели пользовательского механизма просмотра для выполнения всей работы в контроллере. Я продолжу искать более элегантное решение. – Sparafusile