ASP.NET MVC 3: использование перечисляемых методов расширения в представлении - PullRequest
1 голос
/ 23 февраля 2011

Учитывая следующее Razor Partial View и понимание того, что Product является сопоставленным объектом NHibernate, вызовы IEnumerable здесь будут запускать запросы к базе данных (если они не кэшированы).

Это плохая практика? Должен ли я предоставлять более плоское представление моих данных для этого представления, чтобы я мог выполнять эти вызовы в моем контроллере / бизнес-логике?

@model IEnumerable<MyProject.Data.Models.Product>
<table>
    <tr>
        <th></th>
        <th>Total Orders</th>
        <th>Fulfilled</th>
        <th>Returned</th>
        <th>In stock</th>
    </tr>
    @foreach (var product in Model) { 
        <tr>
            <td>
                @Html.ActionLink(product .Name, "Detail", "Product", new { id = product.Id }, null)
            </td>
            <td>
                @product.Orders.Count
            </td>
            <td>
                @product.Orders.Where(x=>x.Fulfilled).Count()
            </td>
            <td>
                @product.Orders.Where(x=>x.Returned).Count()
            </td>
            <td>
                @(product.Stock.Count - product.Orders.Count)
            </td>
        </tr>
    }
</table>

1 Ответ

1 голос
/ 23 февраля 2011

Это плохая практика?

Да. . Фактически он нарушает шаблон MVC - View не должен перезванивать через модель, а только получать, чтобы выполнить свою единственную работу: рендеринг HTML.

Если вам нужна дополнительная информация, а не только одна сущность, заполните ViewModel всей необходимой вам информацией, а затем передайте ее в View.

Кроме того, не просматривайте IEnumerable в модели, используйте Шаблон отображения:

@Html.DisplayForModel()

Преимуществом этого является отсутствие явного цикла, использующего преимущества соглашений MVC и придерживающегося иерархии моделей при привязке модели.

...