Пользовательская модель переплета для детской коллекции - PullRequest
1 голос
/ 11 ноября 2011

Я искал все выше и ниже, так что, надеюсь, кто-нибудь сможет мне помочь. У меня есть класс:

public class Person
{
    public string Name { get; set; }
    public ICollection<Toys> { get; set; }
}

У меня есть метод контроллера:

public ActionResult Update(Person toycollector)
{
....
}

Я хочу привязать к коллекции. Я понимаю, что получу только идентификаторы, но я справлюсь с этим в моем контроллере. Мне просто нужно пролистать коллекцию удостоверений личности. Я начал писать модель переплета:

public class CustomModelBinder : DefaultModelBinder
    {
        protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)
        {
            if (propertyDescriptor.PropertyType == typeof(ICollection<Toys>))
            {
                //What do I do here???
            }
}

Так как мне собрать коллекцию игрушек из значений, переданных в мой метод? Спасибо!

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

if (propertyDescriptor.PropertyType == typeof(ICollection)) {

            var incomingData = bindingContext.ValueProvider.GetValue("Edit." + propertyDescriptor.Name + "[]");
            if (incomingData != null)
            {
                ICollection<Toy> toys = new List<Toy>();
                string[] ids = incomingData.AttemptedValue.Split(',');
                foreach (string id in ids)
                {
                    int toyId = int.Parse(id);
                    toys.Add(new Toy() { ToyID = toyId });
                }
                var model = bindingContext.Model as Person;
                model.Toys = toys;
            }
            return;
        }

Ответы [ 2 ]

3 голосов
/ 12 ноября 2011

Для этого вам не нужно настраивать связыватель пользовательских моделей.

См. в этом посте Фила Хаака для полной реализации, но основная идея заключается в том, что для каждого элемента вколлекции, вы создаете поле формы, которое соответствует следующему соглашению об именах:

Toys[index].<FieldName>

Так, например, если вы хотите связать 3 игрушечных объекта:

<input type="hidden" name="Toys[0].Id" value="1" />
<input type="hidden" name="Toys[1].Id" value="2" />
<input type="hidden" name="Toys[2].Id" value="3" />

Важная частьчто все значения индекса учтены и индексы не пропущены.Например, если у вас есть значение формы Toys[1].<FieldName>, вы должны также иметь значение Toys[0].<FieldName>.

Все это, как говорится, в зависимости от того, что именно вам нужно выполнить, может бытьпроще просто привязать коллекцию идентификаторов, а не целые объекты.Вы можете позволить своему контроллеру преобразовать идентификаторы в реальные модели.

Если вы предпочитаете более простой подход с использованием только идентификатора, все, что вам нужно сделать, это создать объект коллекции string / int / guid (независимо от вашего идентификатора) в модели запроса, а затем создать 1 или несколько полей все они имеют одинаковые имена для каждого значения Id.Связыватель модели по умолчанию автоматически обрабатывает создание коллекции из значений в запросе.

0 голосов
/ 16 ноября 2011

Опираясь на приведенный выше ответ для n игрушек, вы должны использовать цикл for для правильной индексации, например:

@for(var i = 0; i < Model.Toys.Count; i++)
{
    @Html.HiddenFor(m => m.Toys[i].Id)
}

Тогда привязка модели по умолчанию автоматически связывает коллекцию при публикации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...