Динамический выбор макета спарк-мастера во время рендеринга - PullRequest
0 голосов
/ 02 февраля 2012

Мне нужно выбирать свой основной макет свечи каждый раз, когда делается запрос на страницу.Я попытался сделать это, установив значение ViewBag.Layout в OnActionExecuting и сославшись на это значение в мастер-макете, ссылка

<use master="${ViewBag.Layout}"/>

Однако это не работает, кажется, что искра необрабатывать код в скобках не как код, а как строку.Я получаю следующую ошибку:

The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Views/Home/Index.aspx
~/Views/Home/Index.ascx
~/Views/Shared/Index.aspx
~/Views/Shared/Index.ascx
~/Views/Home/Index.cshtml
~/Views/Home/Index.vbhtml
~/Views/Shared/Index.cshtml
~/Views/Shared/Index.vbhtml
Layouts\${ViewBag.Layout}.spark
Shared\${ViewBag.Layout}.spark

Может кто-нибудь сказать мне, почему это?Или укажите мне альтернативный способ сделать это?

Ответы [ 2 ]

1 голос
/ 02 февраля 2012

Макет не может быть выбран динамически с использованием синтаксиса кода.Причина этого заключается в том, что этот макет выбирается до любого рендеринга, происходящего в движке.Итак, сначала расположен макет, а затем движок пытается отобразить все переменные на месте.Использование переменной для макета означает, что движок рендеринга не знает, какой файл открыть.

0 голосов
/ 19 апреля 2012

На самом деле. это возможно .. Вместо использования примера кода. Используйте ResultFilter.

public void OnResultExecuting(ResultExecutingContext filterContext) {
        var viewResult = filterContext.Result as ViewResult;
        if (viewResult == null)
            return;

        var layoutFile = viewResult.ViewBag.Layout; //the variable you set in your action executing,

        viewResult.MasterName = layoutFile;

    }
...