2013-07-29 5 views
4

В asp.net MVC 3 есть способ переопределить объявление макета, заданное в представлении от контроллера или фильтра действий?как переопределить представления Объявление макета

@{ 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
}

Я попытался перекрывая свойство MasterName в OnResultExecuted или OnResultExecuting, как в следующем фрагменте кода, но безрезультатно.

public override void OnResultExecuting(ResultExecutingContext filterContext) 
{ 
    var view = filterContext.Result as ViewResult; 
    view.MasterName = null; 
}

ответ

3

Вы можете создать действие фильтра для переопределения макета файла, но если вы хотите, чтобы удалить его, вам придется создать пустой файл макета вместо назначения мастер свойство NULL. Как это:

public class OverrideLayoutFilter : ActionFilterAttribute 
{ 
    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     var view = filterContext.Result as ViewResult; 
     view.MasterName = "_LayoutEmpty"; 
     base.OnResultExecuting(filterContext); 
    } 
} 

Контроллер:

public class HomeController : Controller 
{ 
    [OverrideLayoutFilter] 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

Теперь ваш новый файл макета должен быть помещен в общая_папка, и вы только поставить функцию RenderBody внутри

_LayoutEmpty.cshtml

@RenderBody() 

Примечание. Если у вас есть разделы, определенные в представлении, которое вы хотите переопределить, вы wi Также необходимо определить те разделы с пустым контентом.

+0

Знаете ли вы, почему настройка MastName на null не работает? – Victor

+0

Я не уверен, но я думаю, что это связано с тем, что MVC не знает, что значение null было установлено «пользователем», поэтому предполагает, что ему нужно загрузить файл макета по умолчанию. Впрочем, это всего лишь предположение. –

2

Используйте ViewBag , когда вам необходимо изменить макет вызвать действие и поставить новый макет (даже пустой) в viewbag.

@{ 
    Layout = ViewBag.layout; 
} 

и внутри действия

if(something) 
    ViewBag.layout = "~/Views/Shared/whatever.cshtml"; 
else 
    ViewBag.layout = null; 
+0

Я m ищет способ сохранить декларацию макета в представлении и просто определить бизнес-правило, когда нужно переключать его с контроллера. – Victor

2

Еще одно место, где вы можете контролировать макет в _ViewStart.cshtml.

Здесь вы можете сделать необходимую логику и программно указать, какой макет использовать. Это позволяет размещать логику только в одном месте и не допускать ее появления.

@{ 
    if(myBusinessRule) 
    { 
     Layout = "~/Views/Shared/_Layout.cshtml"; 
    } 
    else 
    { 
     Layout = "~/Views/Shared/_SecondaryLayout.cshtml"; 
    } 
} 

Blog post where it was introduced by Scott Gu

0

жаль просто добавить реф к одному из моих предыдущих постов на эту тему, но посмотрите здесь, может дать более широкое представление (каламбур) на тему:

Where and how is the _ViewStart.cshtml layout file linked?

+0

Спасибо, что поделились этой ссылкой! – Victor

+0

без проблем победитель –

Смежные вопросы