В зависимости от вяжущего, которые вы используете, это должно работать:
<%var i = 0;
foreach (var product (IList<ProductSelection>)ViewData["products"]) {%>
<%=Html.Hidden(string.Format("products[{0}].Id", i), product.Id)%>
<%=Html.Checkbox(string.Format("products[{0}].Selected", i))%>
<%=product.Name%><br/>
<%}%>
... что приведет к HTML-то вроде этого (обратите внимание на обозначение массива на имена):
<input name="products[0].Id" type="hidden" value="123">
<input name="products[0].Selected" type="checkbox">
Widget
<input name="products[1].Id" type="hidden" value="987">
<input name="products[1].Selected" type="checkbox">
Gadget
... и способ управления, который обрабатывает сообщение:
public ActionResult SelectProducts(IList<ProductSelection> products)
{
...
}
После связывания, продукты PARAMET er будет содержать два экземпляра ProductSelection.
Одно из предостережений заключается в том, что я не использовал новую привязку по умолчанию для сложных объектов. Скорее я использую либо NameValueDeserializer, либо CastleBind, как из MvcContrib. Они оба ведут себя так. Я предполагаю, что привязка к бета-версии будет работать одинаково.