2016-06-11 4 views
-1

Быстрый вопрос ... У меня есть проект, который загружает базовую модель на мою страницу макета. На каждой из моих других моделей я могу ссылаться на эту модель BasePage, которая отлично работает. Тем не менее, если я создаю представление, в котором приводится другая модель, я получаю ошибку компиляции ...ASP.NET MVC 5 Model in View issue

Чтобы яснее объяснить, я делаю вызов представления, в котором подробно описывается список классов для пользователей. Эта модель - IEnumerable<Enrollment>. Подробное представление работает отлично для каждого зачисления, но когда я пытаюсь получить полный список, я получаю ошибку компиляции, которая говорит мне, что для словаря требуется тип модели BasePage.

Никакой ясности в отношении этого было бы здорово!

Извините, если это сбивает с толку, я довольно новичок в .NET ... в основном, в PHP.

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, которую я создал, чтобы показать детали модели пользователя, которая отлично работает с 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 


} 

Это .cshtml страница для деталей пользователя, который отлично работает с _Layout.cshtml используется:

@model FD.Models.User 

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

И, наконец, вот .cshtml для . список Зачисление, который показывает классы пользователя о том, что они в настоящее время зачислены в по некоторым причинам, когда я использовал IEnumerable типа взрывается во время компиляции:

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

Вот ошибка компиляции, которую я получаю в браузере:

Ошибка сервера в приложении «/».

Модели элемент передается в словарь типа «System.Collections.Generic.List`1 [FD.Models.Enrollment]», но это словаря требует модель пункта «FD.WWW.Models типа .BasePage.

Описание: Необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения более информации об ошибке и ее месте в коде.

Сведения об исключении: System.InvalidOperationException: Элемент модели передается в словарь типа «System.Collections.Generic.List`1 [FD.Models.Enrollment]», но это словаря требует элемента модели типа «FD.WWW.Models.BasePage».

+0

в состоянии предоставить какие-либо образцы кода для дальнейшего объяснения вашего вопроса Вы? –

+2

Вам нужно будет показать пример кода с [mcve] – Nkosi

ответ

1

Предполагая, что ваша страница _layout будет также ссылаться на другие страницы, то проблема заключается в том, что вы уже определение модели в _layout типа BasePage затем на странице Приемной вы изменить его на IEnumerable<FD.Models.Enrollment> что вызовет проблемы как ожидается, модель, полученная от BasePage, как указано в _Layout, которая будет иметь приоритет при передаче модели с контроллера на представление. В то время как FD.Models.Enrollment происходит от BasePage, IEnumerable<FD.Models.Enrollment> нет.

Причина, по которой страница пользователя все еще работает, потому что ее модель FD.Models.User происходит от FD.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">