8

Я хочу построить частичный вид, который получает колонку модели и печатает ее. Нечто подобное:asp.net mvc - передать частичную модель данных в частичный вид

На взгляд:

@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. компилятор не позволяет мне отправить Барнда на частичный вид.
  2. Если вы посмотрите на код частичного просмотра, вы увидите слово Brand, которое является именем столбца. Я не хочу жестко закодировать слово «Бренд» в частичном представлении, вместо этого мне нравится, что имя столбца будет там.
  3. В частичном представлении мне нужно поставить @model products_comparison.Models.Product, но я не хочу хочу отправить таблицу отверстий. Я хочу отправить только одну колонку. Но я не знаю, что там положить.

Спасибо!

EDIT:

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

ответ

7

Для попытка изменения @Html.RenderPartial("_DisplayAttribute",Brand) к @Html.Partial("_DisplayAttribute",Brand)

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

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

+0

Вашего ответ 1 установил его .. И я изменить мой вопрос .. – Nir

+0

спасибо! Ваш ответ классный! –

+0

@Nir Это обычно полезно, если вы принимаете ответ, который вам помог. (Пожалуйста, спасибо.) –

12

Начните с рефакторинга и поместите правильную логику в нужное место. Этот запрос 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> 
+0

Спасибо. Моя проблема с ответом заключается в том, что адрес представления в столбце Бранд, а не в столбце. Я хочу, чтобы представление вызывало одно и то же частичное представление для каждого столбца в таблице (для большинства столбцов в таблице). Из-за этого я не передал только бренд в точку зрения, вместо этого я отправляю таблицу отверстий. – Nir

+0

@nir, в этом случае вы можете адаптировать свою модель представления так, чтобы она содержала столбцы и строки таблицы. –

+0

Итак, как это происходит от самой модели? – Nir

Смежные вопросы