Включить / отключить Razor макеты через маршрутизацию - PullRequest
1 голос
/ 19 сентября 2011

Интересно, можно ли динамически переносить добавление макета в частичные представления на основе маршрутизации.

Например:

Суть в том, что я не хочу создавать другой вид с дублированной функциональностью, а лучше установить свойство Layout динамически.

Спасибо.

Ответы [ 2 ]

1 голос
/ 19 сентября 2011

Вы можете создать собственный результат просмотра, который проверяет коллекцию маршрутов и выполняет PartialViewResult или ViewResult. И используйте его вместо View () или PartialView ()

// constructor goes here which accepts model and view name

public override void ExecuteResult( ControllerContext context )
{
    ViewResultBase viewResult;
    // some check
    if( context.RouteData.Values || context.HttpContext.Request.RawUrl  )
    {
        viewResult = new ViewResult();
    }else
    {
        viewResult = new PartialViewResult();
    }
    viewResult.ExecuteResult( context );
}
0 голосов
/ 19 сентября 2011

Попробуйте это:

Действие

public ActionResult Index() {
    ViewBag.Layout = null;

    object layout;
    if (RouteData.Values.TryGetValue("layout", out layout)) {
        switch(layout.ToString())
        {
            case "Layout1":
                ViewBag.Layout = "~/Views/Shared/_Layout.cshtml";
                break;
            // ...
        }
    }

    return PartialView("Test");
}

Разметка

@{
     Layout = ViewBag.Layout;
}

<div>This is the test page...</div>

Конфигурация маршрутизации

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }); // Parameter defaults

routes.MapRoute(
    "DefaultWithLayout", // Route name
    "{layout}/{controller}/{action}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }); // Parameter defaults
}

Или просто

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{layout}", // URL with parameters
    new { controller = "Home", action = "Index", layout = UrlParameter.Optional, id = UrlParameter.Optional }); // Parameter defaults
...