快速提问...我有一个项目,我将基本模型加载到我的布局页面。在我的其他每个模型上,我都可以参考这个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;的模型项。
答案 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
。
你可以
BasePage
模型
或更改注册页面使用的布局,以使用模型中没有BasePage
的布局。
@{Layout = "~/Views/Shared/_SomeOtherLayout.cshtml";}
@model IEnumerable<FD.Models.Enrollment>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">