访问MVC中@model范围外声明的类型

时间:2016-10-30 16:11:15

标签: c# html asp.net-mvc

我创建了一个PersonList类,其中包含不同人群的列表。在我的控制器中,我将该类传递给视图。我的视图是强类型的,所以我引用该类。但是我的视图需要那些组的类型(Student,Retired,Politic),所以我可以在View中的条件语句中使用它们。我通过在PersonList类中为每个组添加一个对象解决了这个问题,但我觉得这不是最好的方法。请指导我更好的解决方案。

  

.cs文件

@model ConferenceAttendees.Models.PersonLists
<style>
h6 {
    display: inline
}
th{
    text-align:center;

}
</style>
<div>
    <table style="width:100%" align="left">
        <tr>
            <th>Imie</th>
            <th>Nazwisko</th>
            <th>Wiek</th>
            <th>Partia</th>
            <th>Doswiadczenie</th>
            <th>Kierunek</th>
            <th>Rok</th>
        </tr>
            @foreach (dynamic item in Model.AllPeople)
            {
              <tr>
              <th>@item.Name</th>
              <th>@item.LastName</th>
              <th>@item.Age</th> 
                @if (item.GetType() == Model.APolitic.GetType())
                {
                    <th>@item.Party</th>
                    <th>@item.Experience</th>
                    <th>b.d</th>
                    <th>b.d</th>
                }
                @if (item.GetType() == Model.AStudent.GetType())
                {
                    <th>b.d</th>
                    <th>b.d</th>
                    <th>@item.Major</th>
                    <th>@item.Year</th>
                }
              </tr>
            }
    </table>
</div>
  

cshtml文件:

fileA.c

1 个答案:

答案 0 :(得分:0)

首先,您可以通过@using指令在Razor视图中导入命名空间。您可以在Students指令之前执行此操作。然后,您可以在视图中使用类型Politicsitem

其次,要检查null是否属于具体类型,您可以使用as运算符查看结果是否不是GetType()。因此,您无需在实例上调用AStudent。现在,您可以删除APoliticARetireddynamic个实例。

此外,您的代码还有两个附注:

  1. 请勿在{{1​​}}循环中使用foreach。您不需要动态输入。相反,请使用Person作为item变量的类型。为此,AllPeople必须是List<Person>类型,而不是List<IPerson>。实际上,您根本不需要IPerson接口,因为您没有在那里定义任何内容。
  2. 我建议您不要在课程中使用复数形式(StudentsPolitics)。 Students的一个实例只是一个学生,为什么不调用班级StudentPolitics
  3. 也是如此

    总而言之,您的观点现在看起来像这样:

    @using ConferenceAttendees.Models
    @model ConferenceAttendees.Models.PersonLists
    <style>
    h6 {
        display: inline
    }
    th{
        text-align:center;
    
    }
    </style>
    <div>
        <table style="width:100%" align="left">
            <tr>
                <th>Imie</th>
                <th>Nazwisko</th>
                <th>Wiek</th>
                <th>Partia</th>
                <th>Doswiadczenie</th>
                <th>Kierunek</th>
                <th>Rok</th>
            </tr>
                @foreach (Person item in Model.AllPeople)
                {
                  var student = item as Student;
                  var politician = item as Politician;
                  <tr>
                  <th>@item.Name</th>
                  <th>@item.LastName</th>
                  <th>@item.Age</th> 
                    @if (politician != null)
                    {
                        <th>@politician.Party</th>
                        <th>@politician.Experience</th>
                        <th>b.d</th>
                        <th>b.d</th>
                    }
                    @if (student != null)
                    {
                        <th>b.d</th>
                        <th>b.d</th>
                        <th>@student.Major</th>
                        <th>@student.Year</th>
                    }
                  </tr>
                }
        </table>
    </div>