2016-06-15 215 views
1

我正在開發一個使用C#和MVC的Web應用程序。其中一個頁面有多個<tr>,其中將包含信息,但該信息會隨着時間(1個月至6個月)範圍而更新。所以我只想顯示包含信息的<tr>。信息存儲在數據庫中,每個<tr>都有自己的專欄。我所採用的方法是讀取數據並在視圖中應用if條件。根據條件顯示錶格行

因此,像

@if (!string.IsNullOrEmpty(Model.SomePropertyOne)) 
{ 
    <tr> 
    <td>@Html.DisplayNameFor(model => model.SomePropertyOne)</td> 
    <td>@Html.DisplayFor(model => model.SomePropertyOne)</td> 
    </tr> 
} 
@if (!string.IsNullOrEmpty(Model.SomePropertyTwo)) 
{ 
    <tr> 
    <td>@Html.DisplayNameFor(model => model.SomePropertyTwo)</td> 
    <td>@Html.DisplayFor(model => model.SomePropertyTwo)</td> 
    </tr> 
} 
... 

我有這個8倍。所以我的問題是,有沒有比這更好的方法,或者我堅持使用所有這些if陳述?

請讓我知道如果你需要任何進一步的信息

+0

在你的榜樣,是兩行應該涉及到不同的屬性?因爲他們都參考'model.SomeProperty' – stuartd

+0

@stuartd是的,他們都涉及到不同的屬性 – Code

+0

可能重複http://stackoverflow.com/questions/16814119/how-do-i-conditionally-show-a-field- in-asp-net-mvc-razor –

回答

1

您可以創建一個DisplayTemplate包含該條件。在/Views/Shared/DisplayTemplates/創建的局部視圖(比方說)MyTemplate.cshtml

@model string 
@if (!string.IsNullOrEmpty(Model)) 
{ 
    <tr> 
     <td>@Html.DisplayNameFor(m => m)</td> 
     <td>@Model</td> 
    </tr> 
} 

然後在視圖

@Html.DisplayFor(m => m.SomeProperty, "MyTemplate") 
@Html.DisplayFor(m => m.AnotherProperty, "MyTemplate") 
.... //etc 

DisplayFor()基於模板將生成的HTML,因此,如果該屬性的值是nullstring.Empty,那麼該屬性將不會生成任何內容。

備註:您不應該使用<table>元素進行佈局(請參閱Why not use tables for layout in HTML?Why Tables Are Bad (For Layout*) Compared to Semantic HTML + CSS)。相反,使用CSS來設計你的佈局。例如,改變DisplayTemplate

<div class="field"> 
    <div class="field-label">@Html.DisplayNameFor(m => m)</div> 
    <div class="field-value">@Model</div> 
</div> 

,並添加以下CSS

.field { 
    position: relative; 
    margin: 5px 0; 
} 
.field-label { 
    position: absolute; 
    width: 240px; 
    color: #808080; 
} 
.field-value { 
    margin-left: 250px; 
} 
0

可以解決通過反射你的問題,這樣的事情:

@foreach(var prop in Model.GetType().GetProperties().Where(x => x.PropertyType == typeof(string))) 
{ 
    var value = prop.GetValue(Model); 
    if (value != null) 
    { 
     <tr> 
      <td>@prop.Name</td> 
      <td><input value="@value.ToString()" name="@prop.Name" /></td> 
     </tr> 
    } 
} 

但是,在這種情況下,你應該避免使用@Html幫手,而是 - 明確寫入相應的html。