Связывание массивов с отсутствующими элементами в asp.net mvc - PullRequest
10 голосов
/ 25 августа 2010

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

, например, с моделью представления

class FooViewModel
{
   public List<BarViewModel> Bars { get; set; }
}

class BarViewModel
{
   public string Something { get; set; }
}

и HTML

<input type="text" name="Bars[1].Something" value="a" />
<input type="text" name="Bars[3].Something" value="b" />
<input type="text" name="Bars[6].Something" value="c" />

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

FooViewModel
{
     Bars
     {
            BarViewModel { Something = "a" },
            BarViewModel { Something = "b" },
            BarViewModel { Something = "c" }
     }
}

Ответы [ 4 ]

7 голосов
/ 11 июля 2011

Добавьте .Index в качестве первого скрытого ввода для работы с непоследовательными элементами, как описано в этом блоге Фила Хаака :

<input type="text" name="Bars.Index" value="" />
<input type="text" name="Bars[1].Something" value="a" />
<input type="text" name="Bars[3].Something" value="b" />
<input type="text" name="Bars[6].Something" value="c" />
0 голосов
/ 09 июля 2011

MVC может заполнить сам список.

public ActionResult Index(FooViewModel model)
{
   ...

Таким образом, независимо от того, что чего-то не хватает, mvc создаст новый List<BarViewModel>, а для каждого найденного индекса - [1], [3], [6] он создаст новый BarViewModel и добавит егок списку.Таким образом, вы получите FooViewModel с заполненными барами.

0 голосов
/ 11 июля 2011

Возможным обходным решением может быть создание экземпляра ViewModel и коллекции до правильного размера (при условии, что он известен), а затем обновление с помощью TryUpdateModel ... что-то вроде:

    [HttpPost]
    public ActionResult SomePostBack(FormCollection form)
    {
        // you could either look in the formcollection to get this, or retrieve it from the users' settings etc.
        int collectionSize = 6; 

        FooViewModel bars = new FooViewModel();
        bars.Bars = new List<BarViewModel>(collectionSize);
        TryUpdateModel(bars, form.ToValueProvider());

        return View(bars);
    }H
0 голосов
/ 25 августа 2010

Я даже не знал, что это сработало!

Имея это в виду, мы сделали что-то вроде:

<input type="text" name="Bars.Something" value="a" />
<input type="hidden" name="Bars.Something" value="" />
<input type="text" name="Bars.Something" value="b" />
<input type="hidden" name="Bars.Something" value="" />
<input type="hidden" name="Bars.Something" value="" />
<input type="text" name="Bars.Something" value="c" />

который мы надеемся опубликовать

a,,b,,,c

но я подозреваю, что будет связываться так же, как вы описываете

Вы, вероятно, собираетесь написать пользовательский механизм связывания моделей, который ищет максимальный индекс, составляет список такого размера, а затем помещает элементы в правильное место.

Сказав все это, подождите, пока кто-нибудь еще опубликует действительно простой атрибут, который вы можете добавить в свою собственность, чтобы он просто работал; D

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