我正在使用ASP.NET MVC应用程序。在这个应用程序中,我正在努力在自定义对象之上创建一个复选框列表。自定义对象如下所示:
LEFT JOIN ... ON ... = d.title
我的模型看起来像这样:
public class ListItem<TId, TLabel, TIsChecked>
{
private TId id;
private TLabel label;
private TIsChecked isChecked;
public ListItem(TId id, TLabel label, TIsChecked isChecked)
{
this.id = id;
this.label = label;
this.isChecked = isChecked;
}
public TId Id
{
get { return id; }
}
public TLabel Label
{
get { return label; }
}
public TIsChecked IsChecked
{
get { return isChecked; }
}
}
然后我有一个控制器,其动作名为Profile,如下所示:
public class MyModel
{
public IEnumerable<ListItem<Guid, string, bool>> Options { get; set; }
}
我在Razor视图中渲染我的复选框选项,如下所示:
[HttpGet]
public ActionResult Profile()
{
var model = new MyModel();
return View(model);
}
[HttpPost]
public ActionResult Profile(MyModel model)
{
return View(model);
}
选项渲染正常。但是,当我保存表单时,看起来只返回第一个选中的复选框ID。我不确定如何a)正确呈现我的HTML以获取复选框列表,以及b)获取值以正确地回发到服务器。我在博文中看过其他例子,但是,我的观点会有更多的HTML。出于这个原因,我试图找出&#34;&#34;&#34;复选框值在客户端呈现,并在ASP.NET MVC中发布回服务器。
答案 0 :(得分:1)
首先,您必须对模型进行更改才能使用List<T>
代替IEnumerable<T>
:
public List<ListItem<Guid, string, bool>> Options { get; set; }
其次,您没有属性的设置器,因此不会回发数据,添加setter:
public TId Id
{
get { return id; }
set { id = value;}
}
public TLabel Label
{
get { return label; }
set { label = value;}
}
public TIsChecked IsChecked
{
get { return isChecked; }
set { isChecked = value;}
}
最后你只需要使用强类型的html帮助器并使用for循环,这样索引可以绑定post的数据:
@for(int i=0; i< Model.Options.Count; i++)
{
<div class="form-group">
<div class="checkbox">
<label>
@Html.CheckBoxFor(model => model.Options[i].IsChecked) @Model.Options[i].Label
</label>
@Html.HiddenFor(model=> model.Options[i].Id)
@Html.HiddenFor(model=> model.Options[i].Label)
</div>
</div>
}
这将创建具有正确名称的复选框,以便它们可以在帖子上绑定。
您可能想查看How List binding works