【问题标题】:Conditional logic in razor view剃刀视图中的条件逻辑
【发布时间】:2014-10-13 07:45:19
【问题描述】:

我有一个包含两列的表格,我想在其上根据性别在两个不同的列中显示一个说学生的列表。模型中的所有这些数据都表示为一个数据集,但是当涉及到视图时,我想将其拆分如下所示

Males                                          Females
===========                                    ==============
John                                            Jane
James                                           Mary

如何在我的 cshtml 视图中实现此逻辑。请注意,这是一个两列表,其中一个将枚举数据。

请在下面找到我使用的剃须刀代码。

<table width="100%" border="1" class="anothertable">
    <tr>
        <td align="left" width="50%">MALES</td>
        <td align="left" width="50%">FEMALES</td>
    </tr>
    @foreach (var rep in Model.Students) {
        <tr>
            <td align="left" border="0">@if (@rep.IsMale)){ 
                <br />
                <ol type="a">
                    <li><span>@rep.Name</span> </li>
                </ol>
                }
            </td>
        else
        {
            <td align="left" border="0">
                <br />
                <ol type="a">
                    <li>@rep.Name</li>
                </ol>
            </td>
        }
        </tr>
    }
</table>

【问题讨论】:

  • 你能显示你的代码吗
  • 这只是循环过滤数据的问题。我看不出这与显示任何类型的数据有什么不同。你被困在哪里了?
  • 你试过但没用的代码在哪里? stackoverflow.com/help/how-to-ask
  • 首先,从 td 标签中取出 isMale 控件。 @if (@rep.IsMale)){ &lt;td align="left" border="0"&gt;...

标签: c# asp.net-mvc razor-2


【解决方案1】:

首先,你应该避免在你的观点中出现任何逻辑;所有的逻辑都应该在控制器中。

考虑到这一点,您可以尝试以下方法:

定义一个视图模型类以将数据保存在两个单独的集合中:

public class StudentsViewModel
{
    public IEnumerable<Student> Males { get; set; }
    public IEnumerable<Student> Females { get; set; }
}

在您的控制器中拆分数据:

public class SomeController
{

    private StudentsRepository _repository;

    public ActionResult SomeAction()
    {
        var students = _repository.LoadStudents();
        var model = new StudentsViewModel
        {
            Males = students.Where(s => s.Gender == Gender.Male),
            Females = students.Where( s => s.Gender == Gender.Female)
        };
        return View(model);
    }
}

在您的视图文件夹中创建两个视图: - 一种用于显示SomeAction 方法的结果(通常是SomeAction.cshtml) - 一个局部视图,用于显示按性别分隔的学生列表,以便重复使用标记

SomeAction查看

@model StudentsViewModel

<div class="left-column">
    <span class="title">Males</span>
    @Html.Partial("name-of-the-partial-view", @Model.Males)
</div>
<div class="right-column">
    <span class="title">Females</span>
    @Html.Partial("name-of-the-partial-view", @Model.Females)
</div>

局部视图将呈现学生列表:

@model IEnumerable<Student>

<ul>
@foreach(var student in Model)
{
    <li>@student.Name</li>
}
</ul>

希望这会有所帮助!

编辑

现在,在您发布代码之后,更容易发现问题:您没有为每一行发出两个表格单元格,而是只发出一个。当您遍历学生集合时,您必须为每个学生创建一个包含两个单元格的行。为此,只需在男学生姓名之后和女学生姓名之前放置一个空单元格,如下所示:

<table width="100%" border="1" class="anothertable">
    <tr>
        <td align="left" width="50%">MALES</td>
        <td align="left" width="50%">FEMALES</td>
    </tr>
    @foreach (var rep in Model.Students) 
    {
        <tr>
            @if (@rep.IsMale))
            { 
                <td align="left" border="0">
                    <br />
                    <ol type="a">
                        <li><span>@rep.Name</span> </li>
                    </ol>
                </td>
                <!-- emit an empty cell here -->
                <td>&nbsp;</td>
            }
            else
            {
                 <!-- emit an empty cell here -->
                <td>&nbsp;</td>
               <td align="left" border="0">
                    <br />
                    <ol type="a">
                        <li>@rep.Name</li>
                    </ol>
                </td>
            }
        </tr>
    }
</table>

【讨论】:

  • 感谢您的所有 cmets
  • @imdondo,请查看编辑 - 它应该可以解决您的问题。
  • 感谢@RePierre,但这仍然给了我空行
  • @imdondo,你能检查一下是否有学生的Name 属性为空?
【解决方案2】:

只是给你一个粗略的想法......

您必须将学生列表传递给您的视图/cshtml

这是一个伪代码

@model List<Student>

<div>
<h2>Male</h2>
<ul>
@foreach(var maleStudent in Model.Where(g=>g.Gender == "Male"))
{
<li>@maleStudent.Name</li>
}
</ul>
</div>

<div>
<h2>Female</h2>
<ul>
@foreach(var femaleStudent in Model.Where(g=>g.Gender == "Female"))
{
<li>@femaleStudent .Name</li>
}
</ul>
</div>

【讨论】:

    猜你喜欢
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多