asp.net mvc - передать частичную модель данных в частичное представление - PullRequest
8 голосов
/ 04 января 2012

Я хочу построить частичное представление, которое получит столбец модели и напечатает его.Примерно так:

При просмотре:

@model IEnumerable<products_comparison.Models.Product>
@{
ViewBag.Title = "Index";

var Brand = (from r in Model
             select r.Brand).Distinct();
}
<h2>
Index</h2>

@Html.RenderPartial("_DisplayAttribute",Brand)

И при частичном просмотре:

<table>
    <tr>
        <th>
            Brand
        </th>
    </tr>
    @foreach (var row in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(r => row)
            </td>
        </tr>
    }
</table>

Есть несколько проблем, с которыми я сталкиваюсь:

  1. Компилятор не позволяет мне отправлять Barnd в частичное представление.
  2. Если вы посмотрите на код частичного представления, вы увидите слово Brand, которое является именем столбца.Я не хочу жестко кодировать слово «Бренд» в частичном представлении, вместо этого мне нравится, что имя столбца будет там.
  3. В частичном представлении мне нужно поместить @model products_comparison.Models.Product,но я не хочу посылать дырочку.Я хочу отправить только один столбец - но я не знаю, что там поставить ..

Спасибо!

РЕДАКТИРОВАТЬ:

Просто чтобы очистить одну вещь, яЯ хочу, чтобы представление вызывало одно и то же частичное представление для каждого столбца таблицы (в любом случае для большинства столбцов таблицы), и каждый раз я отправляю другой столбец (точнее, столбец с отдельным значением).

Ответы [ 2 ]

11 голосов
/ 04 января 2012

Начните с рефакторинга и поместите правильную логику в нужное место. Этот запрос LINQ не имеет ничего общего с представлением. Представление не должно выполнять какие-либо запросы LINQ или что-либо еще для извлечения данных. Предполагается, что представление работает с данными, которые передаются ему из действия контроллера в форме модели представления. Действие контроллера создает и передает адаптированную модель представления, которую вы определили для представления.

Поэтому, как всегда, вы начинаете с определения модели вида, которая будет адаптирована к требованиям вашего вида:

public class MyViewModel
{
    public IEnumerable<Brand> Brands { get; set; } 
}

затем вы пишете действие контроллера, которое заполнит эту модель представления и передаст его представлению:

public ActionResult Foo()
{
    IEnumerable<products_comparison.Models.Product> products = ...
    var model = new MyViewModel
    {
        Brands = (from r in Model select r.Brand).Distinct()
    };
    return View(model);
}

затем просмотр:

@model MyViewModel
<table>
    <tr>
        <th>
            Brand
        </th>
    </tr>
    @Html.DisplayFor(x => x.Brands)
</table>

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

@model Brand
<tr>
    <td>
        @Html.DisplayForModel()
    </td>
</tr>
7 голосов
/ 04 января 2012

Для 1 попробуйте изменить @Html.RenderPartial("_DisplayAttribute",Brand) на @Html.Partial("_DisplayAttribute",Brand)

Вам также потребуется указать модель в частичном представлении, например @model products_comparison.Models.Brand или что-то в этом роде

Также, пожалуйста, уточните 2 и 3, поскольку они не ясно, что вы хотите

...