ASP.NET MVC 4 и MVCContrib Grid: флажок Render для каждого значения TR и Post в сложном типе

MVCContrib Grid:

@model ViewModel
@using (Html.BeginForm("SendData", "Home", FormMethod.Post))
{
    @Html.Grid(Model.List).Columns(c =>
    {
        c.For(x => x.Id);
        c.For(x => x.Name);
        c.For(x =>Html.Partial("Partial/CheckBoxTemplate", new CheckBoxViewModel { Id = x.Id })).Named("Options");
    })

    @Html.SubmitButton()
}

Действие после публикации контроллера:

public ActionResult SendData(List<CheckBoxViewModel> list)
{
    return View();
}

ViewModels:

public class CheckBoxViewModel
{
    public int Id { get; set; }
    public bool CheckBox { get; set; }
}

public class ViewModel
{
    public IPagination<Data> List { get; set; }
}

public class Data
{
    public int Id { get; set; }
    public string Name { get; set; } 
}

Частичный вид:

@model MvcApplication1.Models.CheckBoxViewModel

@Html.HiddenFor(x => x.Id)
@Html.CheckBoxFor(x => x.CheckBox)

Все отмеченные флажками по умолчанию не отмечены.

Как я могу получить все отмеченные значения флажков в моем действии SendData?


person Rookian    schedule 28.10.2012    source источник
comment
Что внутри Partial/CheckBoxTemplate.cshtml? Также кажется, что вы привязаны к некоторому свойству Name (c.For(x => x.Name);), но я не вижу такого свойства, определенного в вашем CheckBoxViewModel. Не могли бы вы показать свой настоящий код?   -  person Darin Dimitrov    schedule 28.10.2012
comment
Но вы передаете в партиал только Id и никогда не устанавливаете логическое свойство CheckBox. Почему вы не используете модель представления? Почему ваш ViewModel использует свойство IPagination<Data> вместо IPagination<CheckBoxViewModel>, что имело бы гораздо больше смысла, поскольку вы пытаетесь создать флажки в своем представлении?   -  person Darin Dimitrov    schedule 28.10.2012


Ответы (1)


Я бы порекомендовал вам использовать реальную модель представления, которая будет отражать требования вашего представления (отображение сетки, содержащей для каждой строки флажок, и отображение идентификатора и имени элемента и получение этих значений в списке в вашем действии обратной передачи) :

public class CheckBoxViewModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool CheckBox { get; set; }
}

public class ViewModel
{
    public IPagination<CheckBoxViewModel> List { get; set; }
}

а затем сделайте ваше представление строго типизированным для этой модели представления:

@model ViewModel

@using (Html.BeginForm("SendData", "Home", FormMethod.Post))
{
    @Html.Grid(Model.List).Columns(c =>
    {
        c.For(x => x.Id);
        c.For(x => x.Name);
        c.For(x => Html.Partial("Partial/CheckBoxTemplate", x)).Named("Options");
    })

    <button type="submit">OK</button>
}

наконец, ваш партиал может выглядеть так:

@model CheckBoxViewModel

@{
    var index = Guid.NewGuid().ToString();
}

@Html.Hidden("list.Index", index)
@Html.Hidden("list[" + index + "].Id", Model.Id)
@Html.Hidden("list[" + index + "].Name", Model.Name)
@Html.CheckBox("list[" + index + "].CheckBox", Model.CheckBox)

Теперь, когда вызывается действие SendData, ему будет передан список вашей модели представления.

В качестве альтернативы вы можете использовать помощник Html.BeginCollectionItem, представленный в _ 6_, что позволит вам использовать строго типизированные версии помощников:

@model CheckBoxViewModel
@using(Html.BeginCollectionItem("list")) 
{
    @Html.HiddenFor(x => x.Id)
    @Html.HiddenFor(x => x.Name)
    @Html.CheckBoxFor(x => x.CheckBox)
}

Рекомендуемая дополнительная литература: Model Binding To A List.

person Darin Dimitrov    schedule 28.10.2012
comment
Меня удивляет одна вещь: почему CheckBoxFor создает дополнительное скрытое поле ввода? - person Rookian; 28.10.2012
comment
Потому что в HTML флажки не отправляют значение, если флажок не установлен. Таким образом, помощник ChekBox добавляет дополнительное скрытое поле с жестко заданным значением false. Таким образом, если флажок не установлен, false будет привязано к логическому полю модели представления, а если флажок установлен, будут отправлены 2 значения с тем же именем: true и false, и первое значение будет привязано. - person Darin Dimitrov; 29.10.2012