尝试将模型发布回Controller,但它会创建一个新模型

时间:2015-06-30 20:59:02

标签: asp.net-mvc

Tpa类是我的基础模型。

public class Tpa
{
    public bool selected { get; set; }
    public int Id { get; set; }
}

Data类创建一个Tpa对象列表。

public class Data
{
    public List<Tpa> Tpas { set; get; }

    public Data()
    {

        this.Tpas = new List<Tpa>();

        this.Tpas.Add(new Tpa()
        {
            selected = false ,
            Id = 1,

        });

        this.Tpas.Add(new Tpa()
        {
            selected = false,
            Id = 2,


        });

        this.Tpas.Add(new Tpa()
        {
            selected = true,
            Id = 3,


        });
    }
}

这是我的。

 [HttpGet]
    public virtual ActionResult Index()
    {
        var model = new Data();
        return View(model);
    }

这是我的观点。

@model TpaUpload_2.Models.Data
@using (Html.BeginForm(MVC.TpaUpload_2.Home.ReceiveID(), FormMethod.Post))

<table class="table">
<tr>
@for (int count = 0; count < Model.Tpas.Count; count++)
        {
            var item = Model.Tpas[count];
            <tr>
                <td>
                    <input type="checkbox"
                           name=@Html.Raw("'s" + count + "CheckBox'")
                           id=@Html.Raw("'s" + count + "CheckBox'")
                           @*checked="@(item.selected == true)"*@ />
                    <label for=@Html.Raw("'s" + count + "CheckBox'" )></label>
                    <input type='hidden'
                            id=@Html.Raw("'s" + count + "CheckBox'" )
                            name='item.selected'
                            value=@Html.Raw("'"+item.selected+"'")/>
</tr>

</table>
<input  type="submit" value="Submit" />

这是我的帖子。

[HttpPost]
public virtual ActionResult ReceiveID(Data myData)
{
...
}

我正在尝试使用复选框值来更改模型上的“已选择”,并回发模型。 问题是在Form提交给Post之后,程序将构造一个新的Data对象,而不是使用传递给控制器​​的Data模型。 我做错了什么?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您使用name属性构建的html与您的模型完全没有关系。提交时,DefaultModelBinder首先初始化您的Data模型(这意味着将3个新的Tpa对象添加到其Tpas属性中。然后尝试查找名称/值表单集合中的对与模型属性匹配,但没有。

首先,您需要修改构造函数以仅包含列表的初始化,并删除添加新项

public class Data
{
   public List<Tpa> Tpas { set; get; }
   public Data()
   {
       Tpas = new List<Tpa>();
   }
}

并在GET方法中添加项目

public virtual ActionResult Index()
{
    var model = new Data();
    model.Tpas .Add(new Tpa(){ selected = false, Id = 1 });
    // add other items
    return View(model);
}

然后,您需要使用强类型的html帮助程序构建正确的视图,以便您的表单控件与模型的关系正确命名

<table class="table">
  @for (int i = 0; i < Model.Tpas.Count; i++)
  {
    <tr>
      <td>
        @Html.HiddenFor(m => m.Tpas[i].Id)
        @Html.CheckBoxFor(m => m.Tpas[i].selected)
        @Html.LabelFor(m => m.Tpas[i].selected)
      </td>
    </tr>
  }
</table>

这为控件提供了模型绑定的正确名称属性,例如

<input type="hidden" name="Tpas[0].Id" ... />
<input type="hidden" name="Tpas[1].Id" ... />
<input type="hidden" name="Tpas[2].Id" ... />

我建议你将它与你目前正在生成的内容进行比较,以了解差异。

另请注意,您当前的html无效 - 您在<tr>元素中有多个<tr>元素,并且您需要包含Id属性的隐藏输入,否则不会发布返回时,您最终会得到3个Tpaid = 0个对象。