2016-10-30 4 views
1

Ich habe eine PersonList-Klasse erstellt, die Listen verschiedener Völkergruppen enthält. In meinem Controller werde ich diese Klasse zur Ansicht weitergeben. Meine Sicht ist stark typisiert, daher verweise ich auf diese Klasse. Aber meine Ansicht erfordert Typen dieser Gruppen (Student, Retired, Politic), damit ich sie in der bedingten Anweisung in View verwenden kann. Ich löste dieses Problem, indem ich ein Objekt pro Gruppe in der PersonList-Klasse hinzufügte, aber ich denke, das ist nicht der beste Weg, dies zu tun. Bitte leiten Sie mich zu einer besseren Lösung.Zugriff auf außerhalb von @model deklarierten Typen in MVC

.cs file

public interface IPerson 
{ 
} 
public abstract class Person 
{ 
    public string Name { get; set; } 
    public string LastName { get; set; } 
    public Int16 Age { get; set; } 
} 
public class Politics : Person, IPerson 
{ 
    public string Party { get; set; } 
    public int Experience { get; set; } 
} 
public class Students : Person, IPerson 
{ 
    public string Major { get; set; } 
    public int Year { get; set; } 
} 
public class Retired: Person, IPerson 
{ 
    public int Pension { get; set; } 
    public string Hobby { get; set; } 
} 
public class PersonLists : IPerson 
{ 
    public List<Retired> AllRetired = new List<Retired>(); 
    public List<IPerson> AllPeople = new List<IPerson>(); 
    public Students AStudent = new Students(); 
    public Politics APolitic = new Politics(); 
    public Retired ARetired = new Retired(); 
} 

cshtml file:

@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> 
+0

erstellen Maß Ansicht-Modell und komponieren, dieses Modell in der Steuerung. Entfernen Sie die @if-Anweisungen aus der Sicht –

Antwort

0

Zuerst Sie einen Namespace in Ihrer Razor Ansicht über die @using Richtlinie importieren. Sie können dies vor der @model Direktive tun. Dann können Sie Ihre Typen Students und Politics aus Ihrer Sicht verwenden.

Zweitens, um zu überprüfen, ob item von einem konkreten Typ ist, können Sie den Operator as verwenden und sehen, ob das Ergebnis nicht null ist. Sie müssen also GetType() nicht auf Ihren Instanzen aufrufen. Jetzt können Sie Ihre AStudent, APolitic und ARetired Instanzen entfernen.

Auch zwei Seiten Notizen Code:

  1. nicht dynamic in der foreach Schleife anwenden. Sie brauchen hier keine dynamische Eingabe. Verwenden Sie stattdessen Person als Typ für die Variable item. Damit dies funktioniert, muss AllPeople vom Typ List<Person> anstelle von List<IPerson> sein. Tatsächlich brauchen Sie die Schnittstelle IPerson überhaupt nicht, da Sie dort nichts definieren.
  2. Ich schlage vor, nicht die Pluralform für Ihre Klassen (Students, Politics) zu verwenden. Eine Instanz von Students ist nur ein Student, also warum nicht die Klasse Student anrufen? Gleiches für Politics.

Alles in allem Ihre Ansicht sieht nun wie folgt aus:

@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> 
+0

Vielen Dank für Ihre Antwort! Alles, was Sie beschrieben haben, funktioniert trotz Anregung über Dynamik in foreach gut. Wenn ich dynamic in foreach durch IPerson ersetze, erhalte ich den folgenden Fehler: "Die Methodengruppe 'Name' kann nicht in den Nicht-Delegate-Typ 'Objekt' konvertiert werden. Wollten Sie diese Methode aufrufen?". –

+0

Sicher, das kann nicht funktionieren. Mein Fehler. Ich habe meine Antwort aktualisiert. –

+0

Als ich getan habe, wie Sie vorgeschlagen habe ich folgenden Fehler erhalten: "Confference.Attendees.Model.Person enthält keine Definition von 'Party' (...)" –

Verwandte Themen