Пользовательский Образцовый Редактор связей для Сложной СПРАВКИ составных объектов

Создайте протокол, подтвердите его на обоих и передайте его в качестве аргумента, вам не важно, какой это тип объекта, вам просто нужно знать, как его использовать, поэтому после завершения вы просто приводите его тип вам нужно, проверьте код ниже, я добавил Video struct как ваш второй, так как у вас его нет в вопросе.

protocol Switchable: Decodable {

}

struct Video: Switchable {

}
struct Photo: Switchable {

}
//Function
func fetchPhotos(url: String, completion: @escaping ([Switchable]?, Error?) -> ()) {
     completion([],nil)
}
//Check on the result after completion is called
let v: [Switchable] = [Video(), Video()]

if let photos = v as? [Photo] {
    print("its photos", photos)
}
if let videos = v as? [Video] {
    print("its videos ",videos)
}
7
задан Brant Bobby 28 May 2009 в 16:17
поделиться

2 ответа

Вам действительно нужно реализовать собственный ModelBinder здесь? Связыватель по умолчанию может делать то, что вам нужно (так как он может заполнять коллекции и сложные объекты):

Допустим, действие вашего контроллера выглядит следующим образом:

public ActionResult SomeAction(Fund fund)
{
  //do some stuff
  return View();
}

И ваш html содержит это:

<input type="text" name="fund.Id" value="1" />
<input type="text" name="fund.Name" value="SomeName" />

<input type="text" name="fund.FundAllocations.Index" value="0" />
<input type="text" name="fund.FundAllocations[0].SomeProperty" value="abc" />

<input type="text" name="fund.FundAllocations.Index" value="1" />
<input type="text" name="fund.FundAllocations[1].SomeProperty" value="xyz" />

Связыватель модели по умолчанию должен инициализировать ваше объект fund с двумя объектами в списке FundAllocations (я не знаю, как выглядит ваш класс FundAllocation, поэтому я создал одно свойство "SomeProperty"). Просто убедитесь, что включили те элементы «fund.FundAllocations.Index» (которые связыватель по умолчанию рассматривает для собственного использования), которые я получил, когда попытался заставить это работать).

8
ответ дан 6 December 2019 в 23:13
поделиться

В последнее время я слишком много тратил на эту же вещь!

Не видя вашу HTML-форму, я предполагаю, что она просто возвращает результаты выбора из списка с множественным выбором или что-то? Если это так, ваша форма просто возвращает набор целых чисел, а не возвращает ваш гидратированный объект FundAllocations . Если вы хотите сделать это, то в вашем собственном ModelBinder вам нужно будет выполнить свой собственный поиск и увлажнить объект самостоятельно.

Что-то вроде:

fund.FundAllocations = 
      repository.Where(f => 
      controllerContext.HttpContext.Request.Form["FundItem.Catalogue.Id"].Contains(f.Id.ToString()); 

Конечно, мой LINQ только для примера, и вы очевидно, может получить данные в любом случае, что вы хотите. Между прочим, и я знаю, что это не отвечает на ваш вопрос, но после долгих раздумий я решил, что для сложных объектов лучше всего использовать ViewModel и привязать ModelBinder по умолчанию к этому, а затем, если мне нужно, увлажните модель, которая представляет мою сущность. Я столкнулся с рядом проблем, которые сделали этот выбор лучшим, я не буду утомлять вас этим, но с удовольствием экстраполирую, если хотите.

Последний подкаст Herding Code большое обсуждение этого, как и К. Скотта Аллена Помещение М в сообщениях блога MVC .

3
ответ дан 6 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: