2016-06-11 20 views
-1

Schnelle Frage ... Ich habe ein Projekt, das ich ein Basismodell in meine Layout-Seite laden. Auf jedem meiner anderen Modelle kann ich auf dieses BasePage Modell verweisen, das gut funktioniert. Wenn ich jedoch eine Ansicht erzeuge, die ein anderes Modell auflistet, erhalte ich einen Kompilierungsfehler ...ASP.NET MVC 5 Modell in der Ausgabe

Um klarer zu erklären, mache ich einen Aufruf an eine Ansicht, die eine Liste der Klasseneinschreibung für einen Benutzer detailliert. Dieses Modell ist ein IEnumerable<Enrollment>. Die Detailansicht funktioniert problemlos für jede Registrierung, aber wenn ich versuche, die vollständige Liste zu erhalten, erhalte ich einen Kompilierungsfehler, der mir sagt, dass das Wörterbuch einen Modelltyp von BasePage benötigt.

Jede Klarheit darüber wäre großartig!

Tut mir leid, wenn das verwirrend ist, ich bin ziemlich neu in .NET ... vor allem ein Hintergrund in PHP.

Basepage Modell -

public abstract class BasePage 
{ 

    public BasePage() 
    { 
     public string prop { get; set; } 
    } 
} 

Enrollment Modell -

public class Enrollment : BasePage 
{ 
    #region modelsettings 

    private static PageDisplayItem PAGE_DISPLAYITEM = new PageDisplayItem() 
    { 
     PageNavigationType = PageNavigationType.FullNavigation, 
     HasSideNavigation = true, 
     HasPageControl = true, 
     HasTableHeader = true, 
     HasPageHeader = true, 
     IsBackgroundDark = false, 
     IsContentTransparent = false 
    }; 

    #endregion 

    public Enrollment() 
    { 
     this.SetPageDisplay(this, PAGE_DISPLAYITEM); 
    } 

    public Enrollment(bool isInitialize, string entityGUID = "") 
    { 
     // common props 
     var session = Helper.GetSession(); 
     var planRepo = new PlanRepository(); 
     var cmnRepo = new CommonRepository(); 


     // set guid 
     if (!string.IsNullOrEmpty(entityGUID)) 
     { 
      var entityRepo = new EntityRepository(); 
      this.EntityItem = entityRepo.ReturnEntityOrUserItem(this.PageLanguageType, entityGUID); 

      if (this.EntityItem.EntityID == 0) 
      { 
       this.EntityItem = new EntityItem() 
       { 
        EntityGUID = session.SessionUserItem.UserGUID, 
        EntityName = session.SessionUserItem.UserFullName, 
        EntityID = session.SessionUserItem.UserID, 
        EntityType = EntityType.User 
       }; 
      } 
     } 
     else 
     { 
      this.EntityItem = new EntityItem() 
      { 
       EntityGUID = session.SessionUserItem.UserGUID, 
       EntityName = session.SessionUserItem.UserFullName, 
       EntityID = session.SessionUserItem.UserID, 
       EntityType = EntityType.User 
      }; 
     } 



     // init 
     if (isInitialize) 
     { 
      // page 
      this.SetPageDisplay(this, PAGE_DISPLAYITEM); 


     } 
    } 

    #region modelprops 

    // BasePage properties 
    public EntityItem EntityItem { get; set; } 
    public bool IsCurrentPeriod { get; set; } 
    public PeriodItem DisplayPeriod { get; set; } 
    public List<PeriodItem> PeriodList { get; set; } 

    // Enrollment properties 
    public string Id { get; set; } 


    #endregion 
} 

Hier wird die _Layout.cshtml Seite ... schneide ich den Mut, der Kürze halber aus:

@model BasePage 

@{ 
    var m = @Model; 
} 
<!DOCTYPE html> 
<html> 
<head> 

    <title>@m.PageTabTitle @m.PageTabTitleExtension</title> 

Hier ist das Benutzermodell, das ich erstellt habe, um die Details des Benutzermodells anzuzeigen, das einwandfrei funktioniert Basepage Modell aus dem User-Modell:

public class User : BasePage 
{ 

    #region modelsettings 

    private static PageDisplayItem PAGE_DISPLAYITEM = new PageDisplayItem() 
    { 
     PageNavigationType = PageNavigationType.FullNavigation, 
     HasSideNavigation = true, 
     HasPageControl = true, 
     HasTableHeader = true, 
     HasPageHeader = true, 
     IsBackgroundDark = false, 
     IsContentTransparent = false 
    }; 

    #endregion 

    public User() 
    { 
     this.SetPageDisplay(this, PAGE_DISPLAYITEM); 
    } 

    public User(bool isInitialize, string entityGUID = "") 
    { 
     // common props 
     var session = Helper.GetSession(); 
     var planRepo = new PlanRepository(); 
     var cmnRepo = new CommonRepository(); 


     // set guid 
     if (!string.IsNullOrEmpty(entityGUID)) 
     { 
      var entityRepo = new EntityRepository(); 
      this.EntityItem = entityRepo.ReturnEntityOrUserItem(this.PageLanguageType, entityGUID); 

      if (this.EntityItem.EntityID == 0) 
      { 
       this.EntityItem = new EntityItem() 
       { 
        EntityGUID = session.SessionUserItem.UserGUID, 
        EntityName = session.SessionUserItem.UserFullName, 
        EntityID = session.SessionUserItem.UserID, 
        EntityType = EntityType.User 
       }; 
      } 
     } 
     else 
     { 
      this.EntityItem = new EntityItem() 
      { 
       EntityGUID = session.SessionUserItem.UserGUID, 
       EntityName = session.SessionUserItem.UserFullName, 
       EntityID = session.SessionUserItem.UserID, 
       EntityType = EntityType.User 
      }; 
     } 



     // init 
     if (isInitialize) 
     { 
      // page 
      this.SetPageDisplay(this, PAGE_DISPLAYITEM); 


     } 
    } 


#region modelprops 

    // BasePage props 
    public EntityItem EntityItem { get; set; } 
    public bool IsCurrentPeriod { get; set; } 
    public PeriodItem DisplayPeriod { get; set; } 
    public List<PeriodItem> PeriodList { get; set; } 

    // User props 
    public string Id { get; set; } 

#endregion 


} 

Dies ist die .cshtml Seite für Benutzerdetails, die mit dem _Layout.cshtml funktioniert gut verwendet:

@model FD.Models.User 

@{ 
    ViewBag.Title = "User Profile"; 
    Layout = "~/Views/Shared/_BaseLayout.cshtml"; 
    var m = Model; 
} 

Und schließlich ist hier die .cshtml für . die Registrierungsliste, die die Benutzerklassen zeigt, dass sie in derzeit eingeschrieben sind Aus irgendeinem Grund, wenn ich die IEnumerable-Typ verwendet explodiert es während der Kompilierung:

@model IEnumerable<FD.Models.Enrollment> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table class="table"> 
// Again, I cut out the rest for the sake of brevity. 

Hier der Kompilierungsfehler, den ich im Browser erhalte:

Server Fehler in '/' Anwendung.

Der Artikel Modell in das Wörterbuch übergeben vom Typ ‚System.Collections.Generic.List`1 [FD.Models.Enrollment]‘, aber das Wörterbuch erfordert ein Modell Artikel vom Typ ‚FD.WWW.Models .BasePage '.

Beschreibung: Bei der Ausführung der aktuellen Webanforderung ist eine nicht behandelte Ausnahme aufgetreten. Bitte überprüfen Sie die Stack-Trace für mehr Informationen über den Fehler und wo es im Code entstanden ist.

Ausnahmedetails: System.InvalidOperationException: Das Element Modell in das Wörterbuch übergeben vom Typ ‚System.Collections.Generic.List`1 [FD.Models.Enrollment]‘, aber das Wörterbuch erfordert ein Modell Artikel vom Typ 'FD.WWW.Models.BasePage'.

+0

Sind Sie in der Lage Proben keine Code, um Ihre Frage weiter zu erklären? –

+2

Sie werden ein Beispiel im Code mit einem [mcve] zeigen – Nkosi

Antwort

1

Unter der Annahme, dass Ihre _Layout Seite wird auch von den anderen Seiten verwiesen wird, dann ist das Problem ist, dass Sie bereits ein Modell in _Layout vom Typ definieren BasePage dann in Ihrer Registrierungsseite Sie es IEnumerable<FD.Models.Enrollment> zu ändern, die ein Problem verursachen Erwartet ein Modell, das von BasePage abgeleitet ist, wie in _Layout deklariert, das Vorrang hat, wenn Sie das Modell vom Controller an die Ansicht übergeben. Während sich FD.Models.Enrollment von BasePage ableitet, ist IEnumerable<FD.Models.Enrollment> nicht.

Der Grund, warum die Benutzerseite immer noch funktioniert, ist, weil das Modell FD.Models.User von FD.WWW.Models.BasePage abgeleitet ist.

Sie können entweder

  1. das BasePage Modell aus dem
  2. _Layout.cshtml entfernen
  3. oder ändern das Layout von der Registrierungsseite verwendet, um eine zu verwenden, die nicht die BasePage wie es Modell haben.

    @{Layout = "~/Views/Shared/_SomeOtherLayout.cshtml";} 
    @model IEnumerable<FD.Models.Enrollment> 
    
    <p> 
        @Html.ActionLink("Create New", "Create") 
    </p> 
    <table class="table">