Создать MVC3 CheckBoxFor из списка <T>и вернуть список (с обновленными значениями) в сообщение - PullRequest
8 голосов
/ 02 декабря 2011

В моей ViewModel есть список, который я анализирую для View

List<BoolSetting> 

BoolSetting:

    public class BoolSetting
{
    public BoolSetting(string displayName, bool value)
    {
        DisplayName = displayName;
        Value = value;
    }
    public string DisplayName { get; set; }
    public bool Value { get; set; }
}

Затем я хочу напечатать флажок для всех элементов в моем списке,поэтому список находится в ViewModel, представление использует

@foreach(var boolSettingList in Model.BoolSettingList)
        {
            <div>
                @Html.CheckBox(boolSettingList.DisplayName, boolSettingList.Value)
                @boolSettingList.DisplayName
            </div>
        }

Проблема в том, что когда я публикую это, моя модель не сохранит обновленные настройки (значения bool) в списке в моей ViewModel и, следовательно, объектпусто.

Я мог бы сделать

foreach (var VARIABLE in userSettingConfigViewModel.BoolSettingList)
        {
            VARIABLE.Value = (bool)Request.Form[VARIABLE.DisplayName];

        }

Но у этой модели представления будет много списков, и некоторые из них будут иметь одинаковые имена!Так что это вызовет конфликты

Так есть ли способ, чтобы foreach распечатать все мои bool, а затем заставить MVC разобраться с тем, чтобы потом вернуть данные в объект List?Я не могу заставить CheckBoxFor работать так, как ему нужно выражение, и я не могу найти способ, как можно перемещаться по списку таким образом

Можно ли исправить это с помощью шаблонов, создав шаблон для BoolSetting и, возможно, List?

1 Ответ

18 голосов
/ 02 декабря 2011

Начните с исправления модели представления и удаления пользовательского конструктора или связывателя модели по умолчанию, который не сможет создать его экземпляр, и вам придется написать собственные связыватели моделей и прочее:

public class BoolSetting
{
    public string DisplayName { get; set; }
    public bool Value { get; set; }
}

public class MyViewModel
{
    public List<BoolSetting> Settings { get; set; }
}

Затем напишите действие контроллера, которое заполнит вашу модель представления:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            Settings = new[] 
            {
                new BoolSetting { DisplayName = "name 1", Value = true },
                new BoolSetting { DisplayName = "name 2", Value = false },
                new BoolSetting { DisplayName = "name 3", Value = true },
            }.ToList()
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}

затем представление (~/Views/Home/Index.cshtml), в котором вы просто используете шаблоны редактора и не пишете никаких циклов foreach или слабо типизированных помощников html, таких как Html.CheckBox. Используя шаблоны редактора, вы убедитесь, что все поля ввода будут иметь правильные имена, чтобы связыватель модели по умолчанию мог извлекать их значения в модель представления во время обратной передачи:

@model MyViewModel
@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.Settings)
    <button type="submit">OK</button>
}

и, наконец, соответствующий шаблон редактора для модели представления, который будет отображаться для каждого элемента коллекции (~/Views/Home/EditorTemplates/BoolSetting.cshtml):

@model BoolSetting
<div>
    @Html.CheckBoxFor(x => x.Value)
    @Html.LabelFor(x => x.Value, Model.DisplayName)
    @Html.HiddenFor(x => x.DisplayName)
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...