1

我的问题与初学者的主题有关(对不起......)。我刚开始使用 MVC,此刻我正在尝试理解这些概念和结构

我来自 webform 的做事方式,现在我需要将旧的 webform 转发器模拟到 MVC 中。在网上寻找替代方案时,我发现 foreach 循环是 MVC 实现这一目标的方式之一,对吗?

然后我有点上下文(如果我说的话表明对某些概念有错误的理解,请纠正我)......

这是我通过 edmx 文件创建的模型类

    public partial class qryMonitor
{
    public int Nsu { get; set; }
    public string NomeDaSolicitacao { get; set; }
    public string Grupo { get; set; }
    public string Prioridade { get; set; }
    public string Transito { get; set; }
    public Nullable<int> IdDestinatario { get; set; }
    public string NomeAutor { get; set; }
    public string DepartamentoAutor { get; set; }
    public int IdAutor { get; set; }
    public Nullable<int> IdAnalistaDesignado { get; set; }
    public string NomeAnalistaDesignado { get; set; }
    public Nullable<int> IdSuperiorAnalistaDesignado { get; set; }
    public string NomeSuperiorAnalistaDesignado { get; set; }
    public string Atividade { get; set; }
    public string CodigoRgb1 { get; set; }
    public string DataSolicitacao { get; set; }
    public int MarcarSolicitacao { get; set; }
}

然后我创建了另一个具有单个属性的类...

public class ChamadosViewModel
{
    public IEnumerable<qryMonitor> Chamados { get; set; }
}

现在我的控制器的代码

public ActionResult Index()
{   
    EntidadesHelpDesk _dbHelpDesk = new EntidadesHelpDesk();
    ChamadosViewModel viewModel = new ChamadosViewModel()
    {
        Chamados = _dbHelpDesk.qryMonitor
            .ToList()
            .Where(x => x.Transito == "Respondida")
            .Select(x => new qryMonitor
            {
                Nsu = x.Nsu,
                Transito = x.Transito,
                NomeDaSolicitacao = x.NomeDaSolicitacao,
                NomeAutor = x.NomeAutor,
                Prioridade = x.Prioridade,
                DataSolicitacao = x.DataSolicitacao
            })
    };
        return View(viewModel);
}

最后是通过向导创建的视图

@model IEnumerable<ServiceDesk.ViewModel.ChamadosViewModel>
@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>
@using (Html.BeginForm())
{
    <p>
        @Html.ActionLink("Create New", "Create")
    </p>
    <table>
        <tr>
            <th></th>
        </tr>

        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ })     |
                    @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey     */ }) |
                    @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey     */ })
                </td>
            </tr>
        }
    </table>
}

当我运行这些时,我得到一个类型不匹配(我能够理解,但不能解决)。完整的按摩是

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

我在网上找了一些类似的主题......我发现很少,但我无法通过比较示例和上述情况来解决问题。

我注意到的一件事是,通常在示例中,我看到了像“Model.ForeachData”这样的代码

在我的情况下,智能感知除了模型本身之外什么都没有(看起来像一组事物,而不仅仅是一个简单的组)。

在此先感谢并为我的英语(不是我的主要语言)感到抱歉。再次感谢您的帮助。

4

2 回答 2

1

您传递给视图的模型包含一个集合,但您正试图直接迭代模型。

更改您的视图代码以使用该Chamados属性。

@foreach (var item in Model.Chamados)

然后,在视图中更改模型类型:

@model ServiceDesk.ViewModel.ChamadosViewModel
于 2012-10-18T20:10:26.147 回答
0

您将视图模型定义为IEnumerable<ServiceDesk.ViewModel.ChamadosViewModel>但在控制器中您没有提供集合,而是提供了单个视图模型。

ChamadosViewModel viewModel = new ChamadosViewModel()
{
    Chamados = _dbHelpDesk.qryMonitor
        .ToList()
        .Where(x => x.Transito == "Respondida")
        .Select(x => new qryMonitor
        {
            Nsu = x.Nsu,
            Transito = x.Transito,
            NomeDaSolicitacao = x.NomeDaSolicitacao,
            NomeAutor = x.NomeAutor,
            Prioridade = x.Prioridade,
            DataSolicitacao = x.DataSolicitacao
        })
};
return View(viewModel);

因此,您要么需要更改控制器为您的视图提供的内容,要么更改您的视图期望接收的内容。

于 2012-10-18T20:10:34.573 回答