Связывание массивов с отсутствующими элементами в asp.net mvc
Я пытаюсь связать динамический массив элементов с моделью представления, где могут отсутствовать индексы в 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" }
}
}
Ответы
Ответ 1
Добавьте .Index
в качестве своего первого скрытого ввода, чтобы иметь дело с элементами из последовательности, как описано в этом блоге Phil Haacked :
<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" />
Ответ 2
MVC может заполнить список.
public ActionResult Index(FooViewModel model)
{
...
Итак, независимо от того, что-то не хватает, mvc создаст новый List<BarViewModel>
и
для каждого найденного индекса - [1], [3], [6] он создаст новый BarViewModel
и добавит его в список. Таким образом, вы получите FooViewModel с заполненными барами.
Ответ 3
Возможным обходным решением может быть создание экземпляра 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
Ответ 4
Я даже не знал, что это сработало!
имея в виду, что id сделал что-то вроде:
<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
но я подозреваю, что будет связываться так же, как вы описываете
Вероятно, вы собираетесь написать настраиваемое связующее устройство, которое ищет индекс max, создает список этого размера, а затем помещает элементы в нужное место.
Говоря все это, подождите, пока кто-то еще опубликует действительно простой атрибут, который вы можете наложить на свое свойство, которое заставляет его работать, D