从视图返回viewmodel会在控制器中提供一个空对象

时间:2013-08-12 22:08:11

标签: c# asp.net-mvc-4 razor visual-studio-2012 asp.net-mvc-viewmodel

我正在做一个小项目。目的是在某些特定日期保持几个用户的存在。此日期首先由用户选择。

因此我使用了一个视图模型。这将提供所有可能的数据,并在表格中显示一个复选框以向用户显示。

在视图中,我每天都在给定的视图模式中走路,我让视图生成一个标签和一个编辑器对象(Html.EditorFor())。所有这些都被表单创建(@ Html.BeginForm())所包围。渲染视图不是问题。

问题是当我尝试返回视图模型时。我收到的viewmodel对象是一个null对象本身。就像它是由默认构造函数创建的。

控制器:

[HttpGet]
    public ActionResult OpldagenLt()
    {
        var lt = _gebruikerRepository.GeefTraject(_gebruikerRepository.TrajectId);
        List<DatumModel> data = new List<DatumModel>();
        foreach (Opleidingdag opldag in lt.GeefOpleidingdagenKleinerDanOfGelijkAanVandaag())
            data.Add(new DatumModel(opldag));

        List<ToekomstModel> toekomst = new List<ToekomstModel>();
        foreach (Opleidingdag opldag in lt.GeefOpleidingdagenGroterDanVandaag())
            toekomst.Add(new ToekomstModel(opldag));

        DataModel datamod = new DataModel();
        datamod.Datums = data;
        datamod.Toekomst = toekomst;

        if (lt.ControleerAantalOpleidingdagen())
        {
             _gebruikerRepository.GekozenDagen = GekozenDagen(datamod) as List<Opleidingdag>;
            return RedirectToAction("Index", "Aanwezigheid");
        }
        return View(datamod);
    }

    [HttpPost]
    public ActionResult OpldagenLt(DataModel model)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        _gebruikerRepository.GekozenDagen = GekozenDagen(model) as List<Opleidingdag>;

        return RedirectToAction("Index", "Aanwezigheid");
    }

    public ICollection<Opleidingdag> GekozenDagen(DataModel datamod)
    {
        List<Opleidingdag> dagen = new List<Opleidingdag>();
            foreach (DatumModel datum in datamod.Datums)
            {
                dagen.Add(datum.Dag);
            }
        return dagen;
    }

查看:

@using(@Html.BeginForm( "OpldagenLt", "Leertraject", FormMethod.Post))
{
<div>
    <table>
        <tr>
            <th colspan="2">reeds begonnen dagen</th>
        </tr>
        @foreach (var item in @Model.Datums)
        {
            <tr>
                <td>@Html.DisplayFor(modelItem => item.Dag.Dag.Day)/@Html.DisplayFor(modelItem => item.Dag.Dag.Month)/@Html.DisplayFor(modelItem => item.Dag.Dag.Year)</td>
                <td>@Html.EditorFor(modelItem => item.Checked)</td>
            </tr>
        }
    </table>
</div>
<div id="toekomst">
    <table>
        <tr>
            <th>Dagen in de toekomst</th>
        </tr>
        @foreach (var item in @Model.Toekomst)
        {
            <tr>
                <td>@Html.DisplayFor(modelItem => item.Dag.Dag.Day)/@Html.DisplayFor(modelItem => item.Dag.Dag.Month)/@Html.DisplayFor(modelItem => item.Dag.Dag.Year)</td>
            </tr>
        }
    </table>
</div>
<div>
    <p><input type="submit" value="Volgende"/></p>
</div>
}

型号:

using System;
using System.Collections.Generic;
using ProjectII.Models.domain;

namespace ProjectII.Viewmodels
{
public class DataModel
{
    public  DataModel()
    {
        Datums = new List<DatumModel>();
    }

    public ICollection<DatumModel> Datums { get; set; }
    public ICollection<ToekomstModel> Toekomst{ get; set; }
}

public class DatumModel
{
    public DatumModel()
    {
        Dag = new Opleidingdag(new DateTime().Date);
        Checked = true;
    }
    public DatumModel(Opleidingdag opldag)
    {
        Dag = opldag;
        Checked = true;
    }

    public Opleidingdag Dag { get; set; }
    public bool Checked { get; set; }
}

public class ToekomstModel
{
    public ToekomstModel()
    {
        Dag = new Opleidingdag(new DateTime().Date);
    }
    public ToekomstModel(Opleidingdag opldag)
    {
        Dag = opldag;
    }

    public Opleidingdag Dag { get; set; }
}
}

提前感谢您的帮助

2 个答案:

答案 0 :(得分:0)

使用构建视图的方式,ModelBinder不能在列表中的不同元素之间进行区分,也不会将它们识别为列表中的项目。尝试构建这样的视图:

@{ int datumteller = 0; }
 @foreach (var item in @Model.Datums)
 {
        <tr>
            <td>@Html.DisplayFor(modelItem => @Model.Datums[datumteller].Dag.Dag.Day)/@Html.DisplayFor(modelItem => @Model.Datums[datumteller].Dag.Dag.Month)/@Html.DisplayFor(modelItem => @Model.Datums[datumteller].Dag.Dag.Year)</td>
            <td>@Html.EditorFor(modelItem => @Model.Datums[datumteller].Checked)</td>
        </tr>
 datumteller++;
 }

@{ int toekomstteller = 0; }
 @foreach (var item in @Model.Toekomst)
 {
        <tr>
            <td>@Html.DisplayFor(modelItem => @Model.Toekomst[toekomstteller].Dag.Dag.Day)/@Html.DisplayFor(modelItem => @Model.Toekomst[toekomstteller].Dag.Dag.Month)/@Html.DisplayFor(modelItem => @Model.Toekomst[toekomstteller].Dag.Dag.Year)</td>
        </tr>
  toekomstteller++
  }

答案 1 :(得分:0)

@stephen:谢谢你的帮助。 在我的脑海中保持你的答案,我终于成功地返回了这些数据。

我把foreach变成了for 并将ICollection更改为List

型号:

using System;
using System.Collections.Generic;
using ProjectII.Models.domain;


namespace ProjectII.Viewmodels
{
public class DataModel
{
    public List<DatumModel> Datums { get; set; }
    public List<ToekomstModel> Toekomst{ get; set; }
}

public class DatumModel
{
    public DatumModel()
    {
        Dag = new Opleidingdag(new DateTime().Date);
        Checked = true;
    }
    public DatumModel(Opleidingdag opldag)
    {
        Dag = opldag;
        Checked = true;
    }

    public Opleidingdag Dag { get; set; }
    public bool Checked { get; set; }
}

public class ToekomstModel
{
    public ToekomstModel()
    {
        Dag = new Opleidingdag(new DateTime().Date);
    }
    public ToekomstModel(Opleidingdag opldag)
    {
        Dag = opldag;
    }

    public Opleidingdag Dag { get; set; }
}
}

视图:

@model ProjectII.Viewmodels.DataModel

@using(@Html.BeginForm())
{
<div>
    <table>
        <tr>
            <th colspan="2">reeds begonnen dagen</th>
        </tr>

         @for (int i = 0; i < Model.Datums.Count; i++)
       {
            <tr>
                <td>@Html.DisplayFor(modelItem => Model.Datums[i].Dag.Dag.Day)/@Html.DisplayFor(modelItem => Model.Datums[i].Dag.Dag.Month)/@Html.DisplayFor(modelItem => Model.Datums[i].Dag.Dag.Year)</td>
                <td>
                     @Html.EditorFor(modelItem => Model.Datums[i].Checked)
                </td>
            </tr>
        }
    </table>

    @*@for (int i = 0; i < Model.Datums.Count; i++)
    {
        <div> @Html.DisplayFor(x => Model.Datums[i].Dag.Dag) 
            @Html.CheckBoxFor(x => Model.Datums[i].Checked) </div>
    }*@

</div> 
<div id="toekomst">
    <table>
        <tr>
            <th>Dagen in de toekomst</th>
        </tr>
        @foreach (var item in @Model.Toekomst)
        {
            <tr>
                <td>@Html.DisplayFor(modelItem => item.Dag.Dag.Day)/@Html.DisplayFor(modelItem => item.Dag.Dag.Month)/@Html.DisplayFor(modelItem => item.Dag.Dag.Year)</td>
            </tr>
        }
    </table>
</div>
<div>
    <p><input type="submit" value="Volgende"/></p>
</div>
}

现在我收到一个具有正确值的模型

感谢帮助人