1

私の質問は初心者のトピックに関連しています(申し訳ありませんが...)。私はMVCを始めたばかりで、現時点では概念を理解して構造化しようとしています

私はWebフォームのやり方から来たので、古いWebフォームリピーターをMVCにシミュレートする必要があります。Webで代替案を探していると、foreachループがこれを実現するMVCの方法の1つであることがわかりました、正しいですか?

それから私は少し文脈を(そして私が言うことがいくつかの概念の間違った理解を示しているなら私を訂正してください)...

これは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]'."

ウェブ上で似たようなトピックをいくつか探しました...ほとんど見つかりませんでしたが、例と上記の状況を比較しても問題を解決できませんでした。

私が注意したことの1つは、通常、サンプルで「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 に答える