2011-02-09 11 views
17

Làm cách nào để nhận được [Display(Name="Some Title")] DataAnnotations "Một số tiêu đề" được hiển thị trong đầu ra của Chế độ xem của giàn giáo?Làm cách nào để lấy tiêu đề cột từ Hiển thị dữ liệu Hiển thị (Tên =) cho một khung nhìn khung danh sách được gõ mạnh mẽ khi chạy?

tôi có thể tạo một danh sách xem giàn giáo gõ mạnh cho lớp này:

public class CompanyHoliday 
{ 
    [Key] 
    public int Id { get; set; } 

    [Required] 
    [Display(Name = "Datum")] 
    [DataType(System.ComponentModel.DataAnnotations.DataType.Date)] 
    public DateTime Date { get; set; } 

    [Required] 
    [StringLength(50)] 
    [Display(Name = "Feiertag Name")] 
    public string Name { get; set; } 
} 

Quan điểm trông như thế này:

@model IEnumerable<Zeiterfassung.Domain.CompanyHoliday> 

@{ 
    ViewBag.Title = "Year"; 
} 

<h2>Year</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table> 
<tr> 
    <th></th> 
    <th> 
     Date 
    </th> 
    <th> 
     Name 
    </th> 
</tr> 

@foreach (var item in Model) { 
<tr> 
    <td> 
     @Html.ActionLink("Edit", "Edit", new { id=item.Id }) | 
     @Html.ActionLink("Details", "Details", new { id=item.Id }) | 
     @Html.ActionLink("Delete", "Delete", new { id=item.Id }) 
    </td> 
    <td> 
     @String.Format("{0:g}", item.Date) 
    </td> 
    <td> 
     @item.Name 
    </td> 
</tr> 
} 

</table> 

Tuy nhiên, tôi không muốn "Ngày" và "Tên" trong tiêu đề bảng. Tôi muốn "Datum" và "Feiertag Name" xuất hiện ở đó.

Tiêu đề cột tiêu đề thực tế phải đến từ Hiển thị chú thích dữ liệu.

Làm cách nào để thực hiện việc này?

+3

Điều này có vẻ như nó sẽ là rất phổ biến, như tất cả những người sử dụng MvcScaffolding nên có vấn đề này giống nhau, và các tên bảng tiêu đề dựa trên tên tài sản đó giàn giáo đặt ở đó không bao giờ là hữu ích trong bất kỳ 'thực 'ứng dụng doanh nghiệp/sản xuất (hoặc bất kỳ thứ gì hỗ trợ nhiều hơn 1 ngôn ngữ). Tôi ngạc nhiên vì không có nhiều câu trả lời ... – CodingWithSpike

Trả lời

18

Bit của một chủ đề cũ, nhưng tôi đã đưa ra một phương pháp mở rộng để xử lý việc này.

phép nói rằng mô hình của tôi là:

public class MyModel 
{ 
    [Display(Name = "Some Property")] 
    public string SomeProp { get; set; } 
} 

Drop phương pháp này vào một lớp tĩnh:

namespace Web.Extensions 
{ 
    public static class HtmlHelperExtensions 
    { 
     public static MvcHtmlString DisplayNameFor<TModel, TProperty>(this HtmlHelper<IEnumerable<TModel>> helper, Expression<Func<TModel, TProperty>> expression) 
     { 
      var name = ExpressionHelper.GetExpressionText(expression); 
      name = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); 
      var metadata = ModelMetadataProviders.Current.GetMetadataForProperty(() => Activator.CreateInstance<TModel>(), typeof(TModel), name); 
      return new MvcHtmlString(metadata.DisplayName); 
     } 
    } 
} 

Sau đó, trong Xem của bạn, mà đang tiến hành một IEnumerable<MyModel>, bạn có thể sử dụng nó như thế này:

@using Web.Extensions 
@model IEnumerable<MyModel> 

<table> 
    <tr> 
     <th> 
      @Html.DisplayNameFor(m => m.AvgElecCost) 
     </th> 

HTML được tạo sẽ là:

 <th> 
      Some Property 
     </th> 

Hy vọng điều đó sẽ hữu ích!

+2

Tuyệt vời, tôi sẽ thêm phần mở rộng này vào hộp công cụ của mình! – kingdango

+4

Tôi đã thêm toàn bộ tệp (cũng chứa một vài phương thức khác) vào Gist: https://gist.github.com/1379767#file_html_helper_display_name_extensions.cs Hãy tận hưởng! – CodingWithSpike

+0

tuyệt vời, cảm ơn bạn! – kingdango

14

Đây là mẫu tôi đã theo dõi. Giả định Danh sách này không bao giờ là rỗng, nhưng có thể trống, nhưng điều kiện có thể dễ dàng được đoản mạch trong một danh sách rỗng. Tôi thực sự thích phương pháp mở rộng của Brian.

@if (Model.BurgersList.Count > 0) 
{ 
    var meta = Model.BurgersList.First(); 
    <table> 
     <tr> 
      <th> 
       @Html.DisplayNameFor(m => meta.Title) 
      </th> 
      <th> 
       @Html.DisplayNameFor(m => meta.HasMustard) 
      </th> 
     //etc.... 
    @foreach (var item in Model.AssignmentDefinitions) 
    { 
     <tr> 
      <td> 
       @Html.DisplayFor(m => item.Title) 
      </td> 
      <td> 
       @Html.DisplayFor(m => item.HasMustard) 
      </td> 
     //etc... 
    } 
    </table> 
} 
else 
{ 
    @:No burgers available. Create(usually make this an action link) a new one. 
} 
4
//MVC4 has the DisplayNameFor Extensions 

public static class HtmlHelperExtensions 
{ 
    public static MvcHtmlString DisplayNameFor<TModel, TProperty>(this HtmlHelper<IEnumerable<TModel>> helper, Expression<Func<TModel, TProperty>> expression) 
    { 
     return DisplayNameFor(expression); 
    } 

    public static MvcHtmlString DisplayNameFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) 
    { 
     return DisplayNameFor(expression); 
    } 

    private static MvcHtmlString DisplayNameFor<TModel, TProperty>(Expression<Func<TModel, TProperty>> expression) 
    { 
     var metadata = ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, new ViewDataDictionary<TModel>()); 
     var htmlFieldName = ExpressionHelper.GetExpressionText(expression); 
     string s = metadata.DisplayName ?? (metadata.PropertyName ?? htmlFieldName.Split(new char[] { '.' }).Last<string>()); 
     return new MvcHtmlString(HttpUtility.HtmlEncode(s)); 
    } 
} 
Các vấn đề liên quan