2010-02-01 1 views
5

Tôi đang xây dựng một bảng dữ liệu như thế nàylà có một cách để thiết lập giá trị HideSurroundingHtml trong ASP.MVC 2

<% foreach (var person in Model.People) 
{ 
%> 
    <tr> 
     <td><%= Html.ActionLink(accessory.Name, "EditPerson") %></td> 
     <td><%= Html.DisplayFor(c => person.Name) %></td> 
     <td><%= Html.DisplayFor(c => person.Age) %></td> 
     <td><%= Html.DisplayFor(c => person.Budget)%></td> 
    </tr> 
<%} %> 

tôi đã tạo ra các mẫu để ghi đè giá trị mặc định sau Brad Wilson's tutorial:

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %> 
<script runat="server"> 
    protected override void OnInit(EventArgs e) { 
     base.OnInit(e); 

     if (ViewData.ModelMetadata.HideSurroundingHtml) { 
      TablePlaceholder.Visible = false; 
     } 
     else { 
      Controls.Remove(Data); 
      DataPlaceholder.Controls.Add(Data); 
     } 
    } 
</script> 
<asp:ContentPlaceHolder runat="server" id="Data" /> 
<asp:PlaceHolder runat="server" id="TablePlaceholder"> 
    <table cellpadding="0" cellspacing="0" border="0" width="100%"> 
     <tr> 
      <td style="width: 10em;"> 
       <div class="display-label" style="text-align: right;"> 
        <asp:ContentPlaceHolder runat="server" id="Label"> 
         <%= ViewData.ModelMetadata.GetDisplayName() %> 
        </asp:ContentPlaceHolder> 
       </div> 
      </td> 
      <td> 
       <div class="display-field"> 
        <asp:PlaceHolder runat="server" id="DataPlaceholder" /> 
       </div> 
      </td> 
     </tr> 
    </table> 
</asp:PlaceHolder> 

Khi hiển thị bảng tôi không muốn hiển thị HTML xung quanh, nhưng tôi không có đầu mối làm thế nào để đặt giá trị HideSurroundingHtml?

Trả lời

3

Một cách sạch hơn và rõ ràng hơn để làm điều đó sẽ là như thế này:

public class MyModel 
{ 
    [AdditionalMetadata("HideSurroundingHtml", true)] 
    public string Something { get; set; } 
} 

Và theo quan điểm của bạn:

bool hideSurroundingHtml = (this.ViewData.ModelMetadata.AdditionalValues.ContainsKey("HideSurroundingHtml") ? (bool)this.ViewData.ModelMetadata.AdditionalValues["HideSurroundingHtml"] : false); 

if (!hideSurroundingHtml) 
{ 
    @:<div> 
} 

//Content. 

if (!hideSurroundingHtml) 
{ 
    @:</div> 
} 
+0

Tôi thích giải pháp này. – adriaanp

+0

Cảm ơn, tôi vẫn không điên về việc làm thế nào clunky HTML biến ra với tất cả các câu lệnh 'if' bạn cần nhưng tôi nghĩ đó là một cách khá dễ hiểu. –

+0

Lưu ý rằng kỹ thuật này tạo và truy cập một mục trong từ điển 'AdditionalValues' và không thực sự thiết lập cờ' HideSurroundingHtml' trong chính 'ModelMetadata'; vô tình, lá cờ vẫn còn sai. – Suncat2000

10

Theo MSDN page on ModelMetadata.HideSurroundingHtml Property:

Khi thuộc tính này được sử dụng với DataAnnotationsModelMetadataProvider cung cấp metadata mô hình, nó được thiết lập để đúng khi cả hai thuộc tính HiddenInputAttribute là đúng và tài sản DisplayValue được thiết lập thành sai.

Vì vậy, bạn cần phải trang trí tài sản của mình trong mô hình của bạn với điều này:

[HiddenInput(DisplayValue = false)] 

tôi không thực hiện bất kỳ ý nghĩa với tôi nhưng có vẻ như để làm việc!

+2

tôi sẽ phải thử nó, nhưng từ cảm giác ruột tôi nghĩ rằng nó sẽ kết xuất với mẫu ẩn và không phải mẫu tôi muốn. – adriaanp

+0

@adriaanp Điều này có thể khiến nó sử dụng mẫu 'HiddenInput', nhưng bạn có thể ghi đè nó bằng thuộc tính' UIHint' trên cùng một thuộc tính. – TLS