2011-09-16 34 views
21

tôi có một cái nhìn với một mô hình mạnh mẽ, đánh máy liên kết với nóLabelFor() trong một foreach

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

Các SomeViewModel trông như thế này

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

và nói Foo là

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

và trong chế độ xem

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

Tôi không chắc chắn làm thế nào để hiển thị Bar tài sản trong item sử dụng Html.LabelFor()

Có thể ai đó giúp tôi với điều này?

Cảm ơn,

+0

Bạn có nhận được một lỗi với mã đó? – AndrewC

+0

@AndyC Tôi không biết làm thế nào để có được Bar cho biến vòng lặp 'item'. f => f. [Không có Bar ở đây. chỉ Foos] ' –

+0

@TheOtherGuy, hầu hết các ví dụ tôi đã thấy có mã hóa cứng các nhãn như tiêu đề bảng và sau đó thực hiện cho từng sau. Bạn đang hiển thị của bạn trong một bảng? Có một lý do bạn cần nhãn trong foreach của bạn (nó sẽ liên tục lặp lại nhãn của bạn cho mỗi hàng) – Manatherin

Trả lời

2

bạn đã thử

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

Việc gia hạn LabelFor sử dụng một biểu thức lamda để đi từ đối tượng Model của bạn đối với tài sản được lựa chọn, cân nhắc f một biến substituion cho mô hình của bạn. Vì vậy, bạn cần một cách để có được từ mô hình của bạn đến tài sản bạn đã chọn. Bạn đang nói với LabelFor, tạo một biến cục bộ được gọi là f và gán nó với giá trị của mô hình của bạn. sau đó sử dụng bit sau khi => để xác định thuộc tính đích.

Nếu bạn đang tuyệt vọng để sử dụng foreach, bạn sẽ phải có một cách dịch item trở lại một tài sản của mô hình ban đầu, (ví dụ cho một mảng như Gledrius nói x=>x.Foos[Model.Foos.IndexOf(foo)])

không rằng nếu bạn chỉ muốn giá trị văn bản

sử dụng '<% = item%>' thay vì toàn bộ labelfor hoặc nếu bạn có ASP.NET 4 và MVC2 hoặc sử dụng tốt hơn <%: item %> cho rằng mã hóa HTML tốt lành

+0

Tôi sẽ thử điều này nhưng không thể sử dụng 'foreach'? –

+1

LabelFor mất một biểu thức như một tham số, do đó bạn không thể vượt qua nó một đối tượng (vì vậy bạn không thể vượt qua nó biến mục của bạn). – AndrewC

+0

xem câu trả lời cập nhật –

0

Từ here, có vẻ như bạn cần phải xác định DisplayName về tài sản:

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

Đó không phải là những gì anh ta yêu cầu. – SLaks

+0

Vấn đề là, tôi không biết làm thế nào để đi về việc xác định Bar bất động sản. Có phải 'f => f.Bar' (không biên dịch) hay' item => item.Bar' (không biên dịch) –

+0

@TheOtherGuy - Làm thế nào về 'Html.LabelFor (x => item.Bar) ' – SwDevMan81

0

nếu Foos sẽ là danh sách, nó sẽ trông như thế này:

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

Bạn đang lặp qua Foo nhưng không sử dụng biến mục.

+1

Làm cách nào để tôi sử dụng' mục'? khi tôi làm 'item => item.Bar', tôi nhận được' Một tham số có tên là item không thể được khai báo trong phạm vi này ... ' –

+0

Tại sao điều này lại bị downvoted? – AndrewC

39

làm điều này thay vì:

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

Thay vì f => f.Bar do f => item.Bar, trong đó mục là tên của biến trong vòng lặp foreach của bạn.

Đây là cú pháp dao cạo nhiều đẹp hơn :)

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

Nên được đánh dấu là câu trả lời đúng, IMO. – richeym

+3

Đồng ý, đây là câu trả lời đúng. – Dean

+0

Thật tuyệt vời. Không chắc chắn làm thế nào và tại sao mặc dù. Một giải thích về sự cần thiết cho sự không phù hợp sẽ hữu ích cho các noobs. – Snekse

2

Bạn cũng có thể chỉ cần viết một phần mở rộng tùy chỉnh mà không gắn trực tiếp vào Model of the page.

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

Và bạn muốn sử dụng nó, như thế này:

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