ASP.NET MVC - CheckBox列表ID,名称和值

时间:2016-04-14 19:04:34

标签: asp.net-mvc

我正在使用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中发布回服务器。

1 个答案:

答案 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)&nbsp;@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