2013-12-10 95 views
0

我有一个布局页面,并且目前有一个页面使用该布局。我想要在页面上显示或隐藏部分页面。如果它隐藏,则需要调整其他样式更改,如主内容div的宽度。下面是我非工作在这个尝试:从子页面呈现控件布局

布局页

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

<div class="row"> 
    @if(ViewBag.ShowTree){ 
    <div class="col-md-2"> 
     @Html.Action("ItemTree") 
    </div> 
    } 
    <div class="@(ViewBag.ShowTree ? "col-md-10" : "col-md-12")"> 
     @RenderBody() 
    </div> 
</div> 

子页面

@{ 
    ViewBag.Title = "Edit"; 
    Layout = "~/Views/Shared/_NestedLayout.cshtml"; 
    ViewBag.ShowTree = false; 
} 

在这种情况下为ShowTree值设置为true,布局页面呈现,然后孩子将其设置为false,并呈现内容。基于MVC的页面生命周期,这非常有意义。但当然不是我想要它如何工作。

我知道我可以在控制器中设置这个值,而不是将它设置在布局/网页中,但是我希望如果我可以将它设置为纯粹的设计,并且保持它不在控制器。

我的偏好是它根本不会调用该操作,而不仅仅是使用JavaScript隐藏数据。

回答

0

我喜欢你的方法,但如果这不起作用,唯一的其他机制我可以认为子视图可​​以控制布局的位置将使用@section。不理想,但应该工作。

布局页:

<div class="row"> 
    @RenderSection("ItemTreeSection", required: false) 

    <div class="@(ViewBag.ShowTree ? "col-md-10" : "col-md-12")"> 
     @RenderBody() 
    </div> 
</div> 

子视图:

@section ItemTreeSection { 
    <div class="col-md-2"> 
     @Html.Action("ItemTree") 
    </div> 
} 
+0

所以我就必须同时使用部分和标志...不理想,但它可能会工作,我想。 – Peter

+0

Arghhh,我没有注意到你也在使用该标志来显示不同的网格列。现在我不喜欢我的解决方案。 –