C# MVC-两个模型绑定到同一视图时的转换问题

C# MVC-两个模型绑定到同一视图时的转换问题,c#,asp.net-mvc,entity-framework,asp.net-mvc-4,C#,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,我希望假期对大家都好 我使用MVC,并使用ADO.net实体框架连接到数据库,因此它为我创建了实体 我正在尝试创建一个视图,该视图将使用两个模型-配对和玩家。每个输出的存储过程列表,我将放在页面的两个选项卡下。我发现一篇文章解释了将两个模型绑定到一个视图的几种不同方式。经过一些努力,我决定使用ExpandoObject()。但是,当我调出页面时,出现以下错误: Cannot implicitly convert type 'System.Web.Mvc.ViewResult' to 'Syst

我希望假期对大家都好

我使用MVC,并使用ADO.net实体框架连接到数据库,因此它为我创建了实体

我正在尝试创建一个视图,该视图将使用两个模型-配对和玩家。每个输出的存储过程列表,我将放在页面的两个选项卡下。我发现一篇文章解释了将两个模型绑定到一个视图的几种不同方式。经过一些努力,我决定使用ExpandoObject()。但是,当我调出页面时,出现以下错误:

Cannot implicitly convert type 'System.Web.Mvc.ViewResult' to 
'System.Collections.IEnumerable'. An explicit conversion exists (are you 
missing a cast?)
以下是我的模型上下文:

public virtual ObjectResult<usp_GetMatchups_Result> usp_GetMatchups()
        {
            return 
 ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<usp_GetMatchups_Result>("usp_GetMatchups");
        }

        public virtual ObjectResult<usp_GetAllNFLPlayers_Result> usp_GetAllPlayers()
        {
            return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<usp_GetAllPlayers_Result>("usp_GetAllPlayers");
        }
我的观点是这样的(为了简单起见省略了一些,但如果需要更多,请告诉我):

@模型动态
@使用SchmuckSports.Controllers;
@{
ViewBag.Title=“足球窝”;
}
@foreach(Model.Matchup中的var匹配)
{
@匹配日期
@match.TeamAbbrev.Replace(
;,“
”) @匹配.排列.替换( ;,“
”) @匹配。总计。替换( ;,“
”)
那么,为了使类型相同,我应该修改什么呢?很抱歉,我对这种语法不够精通,无法找到它的确切位置


感谢所有人的帮助!

您的
匹配列表
出于某种原因返回包装到视图中的列表:

return View(db.usp_GetMatchups())
只有当你把它作为MVC操作使用时才需要它。事实似乎并非如此——你似乎把它作为实际操作的实用方法使用

考虑到MatchupList方法的简单性,我将完全跳过它:

FTBL.Matchup = db.usp_GetMatchups();

ObjectResult是什么还不是很清楚,但假设这是某种类型的列表,这将有助于您消除异常。

您的
MatchupList
出于某种原因返回包装到视图中的列表:

return View(db.usp_GetMatchups())
只有当你把它作为MVC操作使用时才需要它。事实似乎并非如此——你似乎把它作为实际操作的实用方法使用

考虑到MatchupList方法的简单性,我将完全跳过它:

FTBL.Matchup = db.usp_GetMatchups();

ObjectResult是什么还不是很清楚,但假设这是某种列表,这应该可以帮助您消除异常。

我建议创建一个模型,其中包含您希望在视图中呈现的内容,而不是使用
动态
,这样您的视图将是强类型的。然后您将拥有intellisene,其余的内容将非常复杂更容易

public class DashboardViewModel
{
    public MatchupList Matchups {get;set;
    public PlayerList Players {get;set;}
}

public ActionResult FtblDashboard()
{
    var matchups = db.usp_GetMatchups();
    var players = db.usp_GetAllPlayers()
    var viewModel = new DashboardViewModel
        { Matchups = matchups, Players = players };        
    return View(viewModel);
}
然后开始你的观点

@model DashboardViewModel
现在所有内容都是强类型的,剩下的就更容易了。如果在不同的选项卡上显示数据,您可能会发现将每个选项卡创建为单独的局部视图也更容易。这将使每个视图更小、更易于管理


使用
dynamic
,有充分的理由,但这些理由并不经常出现。任何可以强类型的东西都应该是这样。这样你就会在编译器中出错。否则你就必须运行应用程序,如果你做了一些非常小的事情,比如拼写错误或引用错误的模型,你就会出现运行时错误

我建议创建一个模型,该模型包含要在视图中呈现的内容,而不是使用
动态
,这样您的视图将是强类型的。这样您就有了intellisene,其余的就容易多了

public class DashboardViewModel
{
    public MatchupList Matchups {get;set;
    public PlayerList Players {get;set;}
}

public ActionResult FtblDashboard()
{
    var matchups = db.usp_GetMatchups();
    var players = db.usp_GetAllPlayers()
    var viewModel = new DashboardViewModel
        { Matchups = matchups, Players = players };        
    return View(viewModel);
}
然后开始你的观点

@model DashboardViewModel
现在所有内容都是强类型的,剩下的就更容易了。如果在不同的选项卡上显示数据,您可能会发现将每个选项卡创建为单独的局部视图也更容易。这将使每个视图更小、更易于管理


使用
dynamic
,有充分的理由,但这些理由并不经常出现。任何可以强类型的东西都应该是这样。这样你就会在编译器中出错。否则你就必须运行应用程序,如果你做了一些非常小的事情,比如拼写错误或引用错误的模型,你就会出现运行时错误

非常感谢您纠正了这一点。这确实纠正了我的错误。再次非常感谢!非常感谢您纠正了这一点。这确实纠正了我的错误。再次非常感谢!是的,谢谢。我以前尝试过ViewModel,但也遇到了隐式转换问题,因此我转到另一个选项。我相信问题也是一样的-我仍然在使用返回视图方法。有人建议我放弃它,我认为这也应该很好。我对此有几个问题。在尝试使用ViewModel时,我假设我最终仍然会遇到转换问题,因为我的MatchupList和PlayerList contoller方法返回视图()从带有“ObjectResult”类的ADO.net生成的实体数据模型:公共虚拟ObjectResult如何更改此语法以仅返回“usp_GetMatchups”的结果将存储过程转换为泛型列表?泛型列表是否是最佳输出?希望我的问题有意义。我是新手。
ObjectResult
类有一个
GetList
方法。这将返回一个
IList
。因此,您可以将模型更改为
IList
IEnumerable
。我更改了查看模式l属性到IEnumerable,如上所述,它工作得很好。非常感谢!是的,谢谢。我以前尝试过ViewModel,但也遇到了隐式转换问题,所以我转到了另一个选项。我相信问题是一样的-我仍然在使用返回视图方法。有人建议取消它,我认为这应该很有效在。我对此也有一些问题。在尝试使用ViewModel时,我假设最终仍会遇到转换问题,因为我的MatchupList和PlayerList控件器方法从我的ADO.net生成的实体数据模型返回View(),该实体数据模型具有“ObjectResult”类:publ