根据条件显示表行

时间:2016-06-15 09:35:59

标签: c# asp.net-mvc

我正在使用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语句?

如果您需要任何进一步的信息,请与我们联系

2 个答案:

答案 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,因此如果属性的值为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;
}

答案 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。