2016-06-11 15 views
-1

簡単な質問...基本ページをレイアウトページに読み込むプロジェクトがあります。私の他のモデルのそれぞれで、私はこのBasePageのモデルを参考にすることができます。しかし、別のモデルをリストするビューを作成すると、コンパイルエラーが発生します。ASP.NET MVC 5モデルのビューの問題

もっと明確に説明するために、私はユーザーのクラス登録の詳細を示すビューを呼び出します。このモデルはIEnumerable<Enrollment>です。詳細ビューは登録ごとにうまく動作しますが、完全なリストを取得しようとすると、辞書タイプにBasePageのモデルタイプが必要であることを示すコンパイルエラーが発生します。

これに関する明快さは素晴らしいでしょう!

申し訳ありませんこれは混乱している場合、私はかなり.NETの初心者です。

BasePageクラスモデル -

public abstract class BasePage 
{ 

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

登録モデル -

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 
} 

ここでは_Layout.cshtmlページです...私は簡潔のために勇気を切り取る:

@model BasePage 

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

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

ここでは、Userモデルの詳細を表示するために作成したUserモデルを示します。 UserモデルからBasePageクラスモデル:

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 


} 

これは_Layout.cshtmlが使用されていると正常に動作し、ユーザーの詳細について.cshtmlページです:

@model FD.Models.User 

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

そして最後に、ここのため.cshtmlがあります。

ここ
@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. 

がある:私はIEnumerableをタイプを使用したとき、彼らは現在に在籍しているユーザーのクラスを示し登録リストにはいくつかの理由、それはコンパイル時に爆発しますブラウザでコンパイルエラーが発生します。

'/'アプリケーションでサーバーエラーが発生しました。辞書に渡さ

モデル項目タイプ 「System.Collections.Generic.List`1 [FD.Models.Enrollment]」であるが、これ 辞書はタイプ「FD.WWW.Modelsのモデル項目が必要.BasePage '。

説明現在のWeb要求の の実行中に、未処理の例外が発生しました。エラーについての詳細とコード内のどこで発生したのかについては、スタックトレースを参照してください。

例外の詳細:System.InvalidOperationExceptionが:辞書に渡さモデル項目 タイプの「System.Collections.Generic.List`1 [FD.Models.Enrollment]」であるが、この 辞書モデルアイテムを必要とタイプ 'FD.WWW.Models.BasePage'の。あなたの_layoutページはまた、他のページによって参照されていると仮定すると

+0

あなたは、さらにあなたの問題を説明するために、任意のコードサンプルを提供することができますか? –

+2

あなたは[mcve]のコードで例を示す必要があります。 – Nkosi

答えて

1

問題はすでに問題の原因となるあなたがIEnumerable<FD.Models.Enrollment>にそれを変更し、あなたの登録ページに続いタイプBasePageの_layoutでモデルを定義しているということですそのモデルをコントローラからビューに渡すときに優先される、_Layoutで宣言されたBasePageから派生したモデルを期待しています。 FD.Models.EnrollmentBasePageに由来しますが、IEnumerable<FD.Models.Enrollment>はありません。

ユーザーページがまだ機能するのは、モデルFD.Models.UserFD.WWW.Models.BasePageに由来するためです。

あなたはどちらか

  1. はモデルとしてBasePageを持っていないものを使用する登録ページで使用される_Layout.cshtml
  2. または変更レイアウトからBasePageモデルを削除することができます。

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