8

Chcę zbudować częściowy widok, który pobiera kolumnę modelu i ją drukuje. Coś takiego:asp.net mvc - przekazać częściowy model danych do częściowego widoku

Na widoku:

@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) 

A przy częściowym widokiem:

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

Istnieje kilka problemów wpadam:

  1. kompilator nie pozwala mi wysłać Barnda do częściowego widoku.
  2. Jeśli spojrzysz na kod widoku częściowego, zobaczysz słowo Marka, które jest nazwą kolumny. Nie chcę, aby w częściowym widoku zakodowane było słowo "Brand", zamiast tego podoba mi się nazwa kolumny.
  3. W częściowym widoku muszę umieścić @model products_comparison.Models.Product, ale nie chcę chcesz wysłać tabelę otworów. Chcę wysłać tylko jedną kolumnę - Ale nie wiem, co tam umieścić ..

Dzięki!

EDIT:

Wystarczy usunąć jedno, chcę, że widok będzie wywoływać ten sam częściowy widok dla każdej kolumny w tabeli (dla większości kolumn w tabeli i tak) i za każdym razem będę wyślij inną kolumnę (dokładną kolumnę wartości dokładnej).

Odpowiedz

7

Dla Spróbuj zmienić @Html.RenderPartial("_DisplayAttribute",Brand) do @Html.Partial("_DisplayAttribute",Brand)

Należy również określić model w częściowym widokiem jak @model products_comparison.Models.Brand czy coś jak to

Również proszę wyjaśnić 2 & 3, ponieważ nie są jasne co chcesz

+0

Twoja odpowiedź do 1 naprawić go .. I edytować moje pytanie .. – Nir

+0

Dzięki! Twoja odpowiedź jest fajna! –

+0

@Nir Zazwyczaj pomocna jest funkcja "Zaakceptuj" odpowiedź, która ci pomogła. (Proszę i dziękuję.) –

12

Zacznij od refaktoryzacji i umieszczenia właściwej logiki we właściwym miejscu. To zapytanie LINQ nie ma nic wspólnego z widokiem. Widok nie powinien wykonywać żadnych zapytań LINQ ani niczego innego, aby pobierać dane. Widok powinien działać z danymi przekazanymi do niego z akcji kontrolera w postaci modelu widoku. Akcja kontrolera buduje i przekazuje dostosowany model widoku zdefiniowany dla widoku.

Tak jak zawsze zacząć od zdefiniowania widoku modelu, który będzie dostosowany do wymagań Państwa zdaniem:

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

czym piszesz działania kontroler, który propaguje ten widok modelu i przekazać je do widoku :

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); 
} 

następnie rzutem:

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

i wreszcie ci cou ld określić odpowiedni szablon wyświetlania, które zostaną automatycznie świadczonych dla każdego elementu kolekcji Brands swojego widoku modelu (~/Views/Shared/DisplayTemplates/Brand.cshtml):

@model Brand 
<tr> 
    <td> 
     @Html.DisplayForModel() 
    </td> 
</tr> 
+0

Dziękuję. Mój problem z twoją odpowiedzią polega na tym, że adres widoku do kolumny Marka, a nie do kolumny. Chcę, aby widok wywoływał ten sam widok częściowy dla każdej kolumny w tabeli (dla większości kolumn w tabeli). Z tego powodu nie przekazałem tylko marki do widoku, a raczej wysłałem stół z otworami. – Nir

+0

@ nir, w takim przypadku można dostosować model widoku tak, aby zawierał kolumny i wiersze tabeli. –

+0

Więc jak to odradza się z samego modelu? – Nir

Powiązane problemy