我正在使用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 :(得分: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,因此如果属性的值为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;
}
答案 1 :(得分: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。