【问题标题】:The model item passed into the dictionary is of type... But I have good type in view传入字典的模型项是类型...但我认为类型很好
【发布时间】:2014-12-02 20:18:24
【问题描述】:

您好,我在运行我的应用程序时遇到问题,出现如下错误:

传入字典的模型项的类型为“System.Collections.Generic.List`1[SR.Models.Incydent]”,但此字典需要“SR.Models.Incydent”类型的模型项。

我知道这是因为 in view 可能是对模型的错误参考。 但我的动作看起来像:\

    [HttpGet]
    public ActionResult ZglosIncydent()
    {
        return View();
    }
    [HttpPost]
    public ActionResult ZglosIncydent(Incydent incydent)
    {
        if (ModelState.IsValid)
        {
            incydent.Id = incydent.generateID();
            incydent.DateAdded = DateTime.Now;
            incydent.Status = "NO";
            incydent.Localization = "{52.1234, 53.1234}";
            incydent.Phone = "+48159623478";

            dbIncydent.Incydents.Add(incydent);
            dbIncydent.SaveChanges();

            setFlash("Zgłoszenie Przyjęte", MyController.SUCCESS);

            return RedirectToAction("Index", "Index", new { Area = "SR" });
        }
        return View(incydent);
     }

在我看来:

@model SR.Models.Incydent

@{
    ViewBag.Title = "Zgłoś Incydent";
    Layout = "~/Areas/SR/Views/Shared/_SRLayout.cshtml";
}

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken();
    @Html.ValidationSummary(true);
    <div class="form-group">
        <div class="input-group" style="width: 50%;">
            <label for="Type">Typ Incydentu</label>
            <select class="form-control" id="Type" name="Type" required="required" style="width: 100%">
                <option value="WS">Wypadek Samochodowy</option>
                <option value="P">Pożar</option>
                <option value="Z">Zasłabnięcie</option>
            </select>
        </div>
    </div>
    <div class="form-group">
        <div class="input-group" style="width: 50%;">
            <label for="Description">Opis</label>
            <textarea id="Description" class="form-control" name="Description" required="required" style="resize: none;" rows="5"></textarea>
        </div>
    </div>
    <input type="submit" value="Zgłoś Incydent" class="btn btn-default" />
}

当我看到错误时,我认为@model 的行会导致问题,但它的类型正确。在控制器中,我有第二个动作视图,它返回 IENumerable 并且工作正常。

下方视图和索引操作。

        public ActionResult Index()
        {
            return RedirectToAction("Index", "Index", new { Area = "SR" });
        }
        [HttpGet]
        [Authorize(Roles = "Koordynator")]
        public ActionResult View(String Type = "", String Status = "", String Order = "")
        {
            var Incydents = from s in dbIncydent.Incydents select s;
            switch (Order)
            {
                case "id_desc":
                    Incydents = Incydents.OrderByDescending(s => s.Id);
                    break;
                case "id_asc":
                    Incydents = Incydents.OrderBy(s => s.Id);
                    break;
                case "date_desc":
                    Incydents = Incydents.OrderByDescending(s => s.DateAdded);
                    break;
                case "date_asc":
                    Incydents = Incydents.OrderBy(s => s.DateAdded);
                    break;
                case "type_desc":
                    Incydents = Incydents.OrderByDescending(s => s.Type);
                    break;
                case "type_asc":
                    Incydents = Incydents.OrderBy(s => s.Type);
                    break;
                case "status_desc":
                    Incydents = Incydents.OrderByDescending(s => s.Status);
                    break;
                case "status_asc":
                    Incydents = Incydents.OrderBy(s => s.Status);
                    break;
                default:
                    Incydents = Incydents.OrderBy(s => s.DateAdded);
                    break;
            }

            if (Type != "all" && Status != "all")
                Incydents = Incydents.Where(s => s.Status.Contains(Status) && s.Type.Contains(Type));
            else if (Type != "all" && Status == "all")
                Incydents = Incydents.Where(s => s.Type.Contains(Type));
            else if (Type == "all" && Status != "all")
                Incydents = Incydents.Where(s => s.Status.Contains(Status));
            return View(Incydents.ToList());
        }

【问题讨论】:

  • 显示您的Index 方法。
  • 1) 确保调用了正确的视图。错误屏幕应指示 Razor 尝试处理的视图 2) 检查布局和视图可能使用的任何部分视图等内容。其中一个可能有一个不被满足的模型。
  • 很明显,您正在某个地方将IEnumerable&lt;Incydent&gt; 传递到该视图。从您发布的代码中最明显的是Index() 返回的视图是IEnumerable&lt;Incydent&gt;。那是Index.cshtml 调用Incydent.cshtl 作为部分吗?

标签: c# asp.net-mvc razor


【解决方案1】:

改变

@using (Html.BeginForm())

@using (Html.BeginForm("ActionNameHere", "ControllerNameHere", FormMethod.Post)

这样form 知道POST 的数据在哪里。

【讨论】:

  • 只有当您回发到与呈现视图的 GET 方法名称不同的控制器或方法时,才需要这样做。这并不能回答问题。
猜你喜欢
  • 2013-10-17
  • 2020-09-08
  • 2022-01-16
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
相关资源
最近更新 更多