Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way to make a @section optional with the asp.net mvc Razor ViewEngine?

I have a Page.cshtml similar to the following (that does not work):

@{
    Layout = "../Shared/Layouts/_Layout.cshtml";
    var mycollection = (ViewBag.TheCollection as IQueryable<MyCollectionType>);
}

<h2>@ViewBag.Title</h2>

content here

@if (mycollection != null && mycollection.Count() > 0)
{    
    @section ContentRight
    {    
        <h2>
            Stuff
        </h2>
        <ul class="stuff">
            @foreach (MyCollectionType item in mycollection )
            {
                <li class="stuff-item">@item.Name</li>
            }
        </ul>
    }
}

As I said, this does not work. I want to not define the section if there's nothing in the collection. Is there any way to have something like this work? If not, what are my other options? I'm very new to this Razor ViewEngine.

Edit

In my layout i have:

@if(IsSectionDefined("ContentRight")) 
{
    <div class="right">
        RenderSection("ContentRight")
    </div>
}

what i don't want is the div to output when the section is empty.

like image 331
John Boker Avatar asked Feb 04 '11 21:02

John Boker


1 Answers

I ended up doing something a little hacky to get it working how I needed it.

on my page i have:

@{
    Layout = "../Shared/Layouts/_Layout.cshtml";
    var mycollection = (ViewBag.TheCollection as IQueryable<MyCollectionType>);
    ViewBag.ShowContentRight = mycollection != null && mycollection.Count() > 0;
}

then in my layout i have:

@if(IsSectionDefined("ContentRight") && (ViewBag.ShowContentRight == null ||ViewBag.ShowContentRight == true)) 
{
    <div class="right">
        RenderSection("ContentRight")
    </div>
}
else if(IsSectionDefined("ContentRight"))
{
    RenderSection("ContentRight")
}

If the section is defined it has to be rendered, but if there's no content i dont want the <div>s

If there's a better way i'd like to know.

like image 180
John Boker Avatar answered Sep 27 '22 20:09

John Boker