【问题标题】:Incorrect Models passed to View MVC C# error传递给 View MVC C# 错误的模型不正确
【发布时间】:2016-01-25 11:25:17
【问题描述】:

谁能帮我纠正我在 MVC 中创建视图的问题。通常我只使用添加/视图,它会根据我创建的方法为我搭建一个视图。唯一的问题是,这一次我正在创建一个传递给视图的方法,并且我不断收到此错误消息

The model item passed into the dictionary is of type 'UserJob', 
but this dictionary requires a model item of type
'System.Collections.Generic.IEnumerable`1[UserJob]'. 

我写的方法如下...

public ActionResult AddJob(string userCode)
{
    var jobs = jobsClient.GetAlljobs();
    var alljobsCode = (from s in jobs select s.jobCode).ToList();
    var usersJobs = (from s in db.UserJobs
                               where s.userCode == userCode
                               select s.jobCode).ToList();
    var jobsNeeded = alljobsCode.Except(usersJobs);
    List<UserJobsDTO> list = listBuilder(jobs, jobsNeeded);
    ViewBag.jobCode = new SelectList(list, "jobCode", "jobDescription");
    var model = new UserJob { userCode = userCode };
    return View("AddJob", model);
}

private List<UserJobsDTO> listBuilder(
               jobsService.jobsDTO[] jobs, IEnumerable<string> jobsNeeded)
{
    List<UserJobsDTO> d = new List<UserJobsDTO>();

    var f = jobsNeeded.ToArray();
    var a = jobs.ToArray();

    for (int i = 0; i < f.Length; i++)
    {
        d.Add(new UserJobsDTO()
        {
            jobCode = f.ElementAt(i),
            description = a[i].jobDescription
        });
    }             
        return d;
}

当我在调试时,所有需要的数据都被传递给我声明的所有正确变量,但视图只是没有玩球。我的印象是脚手架会在 Razor 中自动为我生成一个可用的视图?但是这种方法只是想玩。谁能指出我正确的方向??

【问题讨论】:

  • 您不认为错误消息是自我解释吗?您正在使用 var model = new UserJob { userCode = userCode }; 传递单个 UserJob 对象,但视图需要一个 UserJob 集合。
  • 我只想要一个通过,但是如果我将 Razor @model IEnumerable&lt;UserJob&gt; 中的这行代码更改为这行代码@model UserJob 它会产生此错误消息CS1579: foreach statement cannot operate on variables of type 'UserJob ' because 'UserJob' does not contain a public definition for 'GetEnumerator'
  • 这也很明显。当您本身没有集合时,为什么要尝试使用 foreach 循环对其进行迭代?
  • 这正是 Scaffolding 产生的。我想它只会迭代一次。我是否需要自己编写 Razor 才能获得预期的结果?

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


【解决方案1】:

修正版

   public ActionResult AddJob(string userCode)
{
    var jobs = jobsClient.GetAlljobs();
    var alljobsCode = (from s in jobs select s.jobCode).ToList();
    var usersJobs = (from s in db.UserJobs
                               where s.userCode == userCode
                               select s.jobCode).ToList();
    var jobsNeeded = alljobsCode.Except(usersJobs);
    List<UserJobsDTO> list = listBuilder(jobs, jobsNeeded);
    ViewBag.jobCode = new SelectList(list, "jobCode", "jobDescription");
//    var model = new UserJob { userCode = userCode };
    return View("AddJob", usersJobs );
}

您需要在此处传递 ienumarable 而不是对象类型。

更新

@model IEnumerable<UserJobs> 

foreach(var item in Model){
   <span>@item.JobId</span>
    <span>@item.JobName</span>

}

【讨论】:

  • 我知道只有一个 userCode 是唯一的,所以我不想在那里有一个 var model = new UserJob 吗?当我向单个用户代码添加作业时
  • 附带说明,最好将'model' 定义为 UserJob 类型,因为您知道它肯定是 UserJob 类型。
  • 如果你想要单个 UserCode,你必须将模型更改为 @model UserJob
  • 如果我更改为@model UserJob 它会产生此错误消息CS1579: foreach statement cannot operate on variables of type 'UserJob ' because 'UserJob' does not contain a public definition for 'GetEnumerator'
  • 好吧,你不能迭代那个。尝试为这个 foreach 循环传递 ViewBag.UserJobs=someienumerablemodel。如果您希望视图中有多个模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 2012-05-13
  • 2015-09-25
  • 2015-01-02
  • 1970-01-01
  • 2017-10-15
相关资源
最近更新 更多