2011-09-16 16 views
21

Mam widoku z silnie wpisany modelu związanego z nimLabelFor() w foreach

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
        Inherits="System.Web.Mvc.ViewPage<SomeNamespace.SomeViewModel>" %> 

SomeViewModel wygląda to

class SomeViewModel 
{ 
    public IEnumerable<Foo> Foos {get; set;} 
} 

i powiedzieć Foo jest

class Foo 
{ 
    public string Bar {get; set;} 
} 

i w widoku

Nie jestem pewien, w jaki sposób wyświetlać Bar nieruchomość w item użyciu Html.LabelFor()

Czy ktoś może mi pomóc z tym?

Dzięki,

+0

Czy otrzymujesz błąd z tym kodem? – AndrewC

+0

@AndyC Nie wiem, jak uzyskać Bar dla zmiennej pętli "item". f => f. [Brak paska tutaj. tylko Foos] ' –

+0

@TheOtherGuy, większość przykładów, które widziałem, zakodowała etykiety jako nagłówki tabeli, a następnie wykonała je dla każdego po. Czy wyświetlasz swoje w tabeli? czy istnieje powód, dla którego potrzebujesz etykiety w foreach (będzie ona ciągle powtarzała twoją etykietę dla każdego wiersza) – Manatherin

Odpowiedz

2

próbowałeś

<% for (var i=0; i<Model.Foos.Count();i++) { %> 
    <tr> 
     <td> 
      <%= Html.LabelFor(f => f.Foos[i].Bar) %> 
     </td> 

Rozszerzenie LabelFor używa wyrażenia lambda, aby przejść z modelu obiektów do wybranego obiektu, należy rozważyć f zmiennej substituion dla danego modelu. Potrzebujesz więc sposobu na przejście z modelu do wybranej nieruchomości. Mówisz LabelForowi, utwórz lokalną zmienną o nazwie f i przypisz ją wartością twojego modelu. następnie użyj bitu po znaku =>, aby określić właściwość target.

Jeśli jesteś zdesperowany, aby skorzystać z foreach, trzeba mieć sposób tłumaczenia przedmiot z powrotem do właściwości oryginalnego modelu (np tablicy jako Gledrius powiedział x=>x.Foos[Model.Foos.IndexOf(foo)])

w przypadku jego braku, jeśli tylko chcą wartość tekstową

stosowanie „<% = pozycja%>” zamiast całego labelfor lub jeśli masz ASP.NET 4 i MVC2 lub lepsze wykorzystanie <%: item %> dla tego kodowania HTML dobroci

+0

Spróbuję tego, ale czy nie można użyć 'foreach'? –

+1

LabelFor przyjmuje wyrażenie jako parametr, więc nie można go przekazać obiektowi (nie można go zatem przekazać zmienną przedmiotu). – AndrewC

+0

zobacz zaktualizowaną odpowiedź –

0

Od here, wygląda jak trzeba określić DisplayName na miejscu:

[DisplayName("My Bar")] 
public string Bar { get; set; } 
+2

Nie o to pyta. – SLaks

+0

Problem polega na tym, że nie wiem, jak określić pasek właściwości. Czy jest to 'f => f.Bar' (nie kompiluje) lub' item => item.Bar' (nie kompiluje się) –

+0

@TheOtherGuy - Jak o 'Html.LabelFor (x => item.Bar) ' – SwDevMan81

0

jeśli Foos będzie lista, to będzie wyglądać następująco:

Html.LabelFor(x=>x.Foos[Model.Foos.IndexOf(item)]) 
0

Wykonujesz iteracje po swoich Foo, ale w ogóle nie używasz zmiennej item.

+1

Jak korzystać z' item'? kiedy wykonuję 'item => item.Bar', otrzymuję' Element o nazwie parameter nie może być zadeklarowany w tym zakresie ... ' –

+0

Dlaczego zostało to odrzucone? – AndrewC

39

czy to zamiast:

<% foreach (var item in Model.Foos) { %>  
<tr>   
    <td>    
     <%= Html.LabelFor(f => item.Bar) %>   
    </td> 
<% } %> 

Zamiast f => f.Bar do f => item.Bar, gdzie item jest nazwą zmiennej w pętli foreach.

Oto znacznie piękniejsze brzytwa składnia :)

@foreach(var item in Model.Foos) { 
<tr> 
    <td> 
     @Html.LabelFor(f => item.Bar) 
    </td> 
    <td> 
     @Html.DisplayFor(f => item.Bar) 
    </td> 
</tr> 
} 
+4

Powinien być oznaczony jako poprawna odpowiedź, IMO. – richeym

+3

Zgadzam się, to jest poprawna odpowiedź. – Dean

+0

To jest niesamowite. Nie wiem, jak i dlaczego. Wyjaśnienie potrzeby niedopasowania byłoby pomocne dla noobów. – Snekse

2

Można też po prostu napisać rozszerzenie niestandardowy, który nie jest związany bezpośrednio z modelem strony.

public static MvcHtmlString LabelForItem<T, V>(this HtmlHelper html, T obj, Expression<Func<T, V>> expression) 
    { 
     Func<T,V> func = expression.Compile(); 
     V val = func(obj); 
     return html.Label(val.ToString()); 
    } 

I chcesz go używać, podobnie jak to:

@foreach (Foo foo in Model) 
{ 
    <p> 
     @(Html.LabelForItem<Foo, string>(foo, f => f.Name)) 
    </p> 
}