ASP.MVC MVC: как не повторить цикл? - PullRequest
0 голосов
/ 21 декабря 2011

Как ясно видно из этого кода, мне нужно 3 (!!!) цикла для заполнения определенных элементов страницы.Какой лучший способ избежать этого?Допустимо ли в ASP.NET MVC framework делать такие вещи?Это не кажется правильным.

<div id="center_box">
    <div class="top">
        <div class="head">

            <h3></h3> -- <!--LOOP 1 to insert title-->
        </div>
        <ul id="center_items_rb">
               <!--LOOP 2 to insert #of <LI> according to benefits count-->
            <li class="checked" onclick="javascript:SelectCenterItem(this, 1);"></li>
            <li class="not_checked" onclick="javascript:SelectCenterItem(this, 2);"></li>
            <li class="not_checked" onclick="javascript:SelectCenterItem(this, 3);"></li>
            <li class="not_checked" onclick="javascript:SelectCenterItem(this, 4);"></li>
        </ul>
    </div>
    <div class="clear">
    </div>
    <div class="pic">
        <!--Loop 3-->
        @foreach (var topBenefit in Model.TopBenefits)
        {
            <div id="center_item_@(topBenefit.BenefitID)">
                @Html.Image("content/Images/@(topBenefit.BenefitImage)", "")
                <div class="line">
                    <div class="right">
                        <h2>
                            @string.IsNullOrEmpty(topBenefit.Description)
                            ? @topBenefit.Description.Substring(0, 100) + "..." 
                            : @System.Configuration.ConfigurationManager.AppSettings["NoDescriptionBenefit"]
                        </h2>
                    </div>
                    <div class="clear">
                    </div>
                </div>
            </div>         
        }
    </div>
</div>

Ответы [ 2 ]

2 голосов
/ 21 декабря 2011

Как лучше всего избежать этого?

Используя шаблон отображения:

<div id="center_box">
    <div class="top">
        <div class="head">
            <h3></h3> --
        </div>
        <ul id="center_items_rb">
            <li class="checked" onclick="javascript:SelectCenterItem(this, 1);"></li>
            <li class="not_checked" onclick="javascript:SelectCenterItem(this, 2);"></li>
            <li class="not_checked" onclick="javascript:SelectCenterItem(this, 3);"></li>
            <li class="not_checked" onclick="javascript:SelectCenterItem(this, 4);"></li>
        </ul>
    </div>
    <div class="clear">
    </div>
    <div class="pic">
        @Html.DisplayFor(x => x.TopBenefits)
    </div>
</div>

и внутри соответствующего шаблона отображения, который будет автоматически отображаться длякаждый элемент коллекции TopBenefits (~/Views/Shared/DisplayTemplates/TopBenefit.cshtml)

@model TopBenefit
<div id="center_item_@(Model.BenefitID)">
    @Html.Image("content/Images/@(Model.BenefitImage)", "")
    <div class="line">
        <div class="right">
            <h2>
                @string.IsNullOrEmpty(Model.Description)
                ? @Model.Description.Substring(0, 100) + "..." 
                : @System.Configuration.ConfigurationManager.AppSettings["NoDescriptionBenefit"]
            </h2>
        </div>
        <div class="clear">
        </div>
    </div>
</div>  

Обратите внимание, что важно имя и расположение шаблона отображения.Он должен быть расположен в ~/Views/Shared/DisplayTemplates, если он предназначен для повторного использования между несколькими контроллерами и внутри ~/Views/SomeController/DisplayTemplates, если он действительно специфичен для данного контроллера и должен называться в качестве типа элементов свойства коллекции.

1 голос
/ 21 декабря 2011

это Model.TopBenefits типа IEnumberable?Если так:

@foreach (var topBenefit in Model.TopBenefits.Take(3))

будет повторять первые 3 преимущества

...