【问题标题】:MVC4 ViewModel System String ErrorMVC4 ViewModel 系统字符串错误
【发布时间】:2014-09-24 18:56:37
【问题描述】:

这是 SO 上的常见错误,但我似乎无法修复该错误 传入字典的模型项是“System.String”类型的,但该字典需要一个“System.Collections.Generic.IEnumerable`1[ITEye.ViewModels.IssueViewModel]”类型的模型项。任何故障排除帮助将不胜感激

视图模型

 public class IssueViewModel
    {
        public int ItemId { get; set; }
        public string Name { get; set; }
        public string ItemLocation { get; set; }
        public string UserName { get; set; }
    }

控制器

public ActionResult Issueds()
        {
            var query = Issue();
            return View(query);
        }
        public IEnumerable Issue()
        {
            var issued = from item in db.Items
                        join issues in db.Issues on item.ItemId equals issues.ItemId
                        join users in db.Staffs on issues.StaffId equals users.StaffId
                        where issues.StaffId == users.StaffId

                         select new IssueViewModel()
                        {
                            ItemId = item.ItemId,
                            Name = item.ItemName,
                            ItemLocation = item.Location.LocName,
                            UserName = users.StaffName
                        };

            return issued.AsEnumerable();
}

查看

@model IEnumerable<ITEye.ViewModels.IssueViewModel>
@foreach (var item in Model) {

<p>
   @item.Name
</p>

}

【问题讨论】:

  • 我将一些与您的代码基本相同的东西放在一起,并且运行良好。你确定没有其他东西会改变 Controller 和 View 之间的 Model,比如 ActionFilter 什么的吗?
  • 我想知道为什么这个问题因为没有研究工作而被否决。

标签: c# asp.net-mvc-4 asp.net-mvc-viewmodel


【解决方案1】:

我确信代码没问题,因为我对此进行了广泛的研究,但问题却是视图中的错误。我使用 @{Html.RenderPartial("Issueds", "Issue");} 而不是 @{Html.RenderAction("Issueds", "Issue");}

【讨论】:

    【解决方案2】:

    在从Issue() 返回之前,您尚未实现实体框架查询,因此它将作为 SQL 字符串传递给视图 - AsEnumerable() 不会做任何事情,因为它已经是 IEnumerable。您需要具体化查询,因此请改用 ToList() 之类的内容。

    还将方法的返回类型更改为泛型:

    public ActionResult Issueds()
    {
        var query = Issue();
        return View(query);
    }
    
    public IEnumerable<IssueViewModel> Issue()
    {
        var issued = from item in db.Items
                    join issues in db.Issues on item.ItemId equals issues.ItemId
                    join users in db.Staffs on issues.StaffId equals users.StaffId
                    where issues.StaffId == users.StaffId
    
                    select new IssueViewModel()
                    {
                        ItemId = item.ItemId,
                        Name = item.ItemName,
                        ItemLocation = item.Location.LocName,
                        UserName = users.StaffName
                    };
    
        return issued.ToList();
    }
    

    【讨论】:

    • 无需调用ToList EF 查询返回一个IQueryable,它实现了IENumerable 并且不会返回一个SQL 字符串。
    • 感谢代码正常工作,罪魁祸首是使用 @{Html.RenderPartial("Issueds", "Issue");} 而不是 @{Html.RenderAction("Issueds", "Issue"); }
    【解决方案3】:

    您的 Issue 方法应该返回 IEnumerable&lt;ITEye.ViewModels.IssueViewModel&gt; 而不是非泛型类型 IEnumerable

       public IEnumerable<ITEye.ViewModels.IssueViewModel> Issue()
        {
            var issued = from item in db.Items
                        join issues in db.Issues on item.ItemId equals issues.ItemId
                        join users in db.Staffs on issues.StaffId equals users.StaffId
                        where issues.StaffId == users.StaffId
    
                         select new IssueViewModel()
                        {
                            ItemId = item.ItemId,
                            Name = item.ItemName,
                            ItemLocation = item.Location.LocName,
                            UserName = users.StaffName
                        };
    
            return issued;
        }
    

    【讨论】:

    • 这个怎么变成视图中的字符串?
    • 它正在成为 OP 代码视图中的字符串,因为只传入了一个非泛型 IENumerable。
    • 感谢代码正常工作,罪魁祸首是使用 @{Html.RenderPartial("Issueds", "Issue");} 而不是 @{Html.RenderAction("Issueds", "Issue"); }
    猜你喜欢
    • 1970-01-01
    • 2014-07-19
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多