2016-06-15 27 views
1

私はC#とMVCを使用してWebアプリケーションを開発しています。ページの1つに複数の情報が含まれる<tr>がありますが、この情報は時間の経過とともに更新されます(1ヶ月から6ヶ月)。だから私は情報を含む<tr>を表示したいだけです。情報はデータベースに保存され、それぞれ<tr>にはそれ自身の列があります。私が行ったアプローチは、データを読んで、ifの条件をビューに適用することです。条件に基づいてテーブルの行を表示する

だから私はこの8回に持って

@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> 
} 
... 

のようなもの。だから私の質問は、これより良いアプローチがあるのでしょうか、これらのすべての文を使用して私は固執していますか?

@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ヘルパーを使用することを避ける必要があります。

私はあなたが任意のより詳細な情報

+0

を追加し、2つの行が異なる特性に関連することになっていますか?彼らは両方とも '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 

プロパティの値である場合に、テンプレートに基づいてHTMLを生成するDisplayFor()null又はstring.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

が必要な場合は、リフレクション経由でそのようなことを、あなたの問題を解決することができます教えてください代わりに、対応するhtmlを明示的に記述します。

関連する問題