ASP.NET MVC 5 Model in View问题

时间:2016-06-11 22:30:31

标签: c# asp.net-mvc asp.net-mvc-5

快速提问...我有一个项目,我将基本模型加载到我的布局页面。在我的其他每个模型上,我都可以参考这个BasePage模型,它可以正常工作。但是,如果我创建一个列出不同模型的视图,我会收到编译错误...

为了更清楚地解释,我调用了一个视图,其中详细列出了用户的课程注册列表。此模型为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模型,用于显示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


}

这是用户详细信息的.cshtml页面,可以正常使用_Layout.cshtml:

@model FD.Models.User

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

最后,这是注册列表的.cshtml,它显示了用户当前正在注册的类。出于某种原因,当我使用IEnumerable类型时,它会在编译期间爆炸:< / p>

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

以下是我在浏览器中遇到的编译错误:

  

&#39; /&#39;中的服务器错误应用

     

传递到字典中的模型项是类型的   &#39; System.Collections.Generic.List`1 [FD.Models.Enrollment]&#39;,但是这个   字典需要一个类型为&#39; FD.WWW.Models.BasePage&#39;的模型项。

     

描述:执行期间发生了未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息以及它在代码中的起源。

     

异常详细信息:System.InvalidOperationException:模型项   传入字典的类型   &#39; System.Collections.Generic.List`1 [FD.Models.Enrollment]&#39;,但是这个   字典需要一个类型为&#39; FD.WWW.Models.BasePage&#39;的模型项。

1 个答案:

答案 0 :(得分:1)

假设您的_Layout页面也被其他页面引用,那么问题是您已经在类型为BasePage的_Layout中定义了一个模型,然后在您的“注册”页面中将其更改为IEnumerable<FD.Models.Enrollment>这将导致问题,因为它期望从_Layout中声明的BasePage派生的模型,当您将模型从Controller传递给View时,它将优先。虽然FD.Models.Enrollment来自BasePage,但IEnumerable<FD.Models.Enrollment>却不是。{/ p>

用户页面仍然有效的原因是因为其模型FD.Models.User来自FD.WWW.Models.BasePage

你可以

  1. 从_Layout.cshtml
  2. 中删除BasePage模型
  3. 或更改注册页面使用的布局,以使用模型中没有BasePage的布局。

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