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模型。 我做错了什么?任何帮助将不胜感激。
答案 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个Tpa
个id = 0
个对象。