ASP. NET контроллер получает нулевой массив

0

Я пишу приложение Angular.js/ASP.NET. Я определил эту модель:

public class Dealer : EntityBase
{
    ...
    public virtual List<DealerDefinedService> DealerDefinedServices { get; set; }
    public virtual List<DealerDefinedServicesDiscount> DealerDefinedServicesDiscounts { get; set; }
    ...
}

И у меня есть контроллер, который может получить эту модель:

[HttpPost]
public ActionResult Edit(Dealer model)
{
    if (ModelState.IsValid)
    {
        dealerService.EditDealer(model);

        return RedirectToAction("Index");
    }
    return View("Create", model);
}

В моем контроллере Angular.js я пытаюсь отправить этот объект:

{
  "DealerDefinedServices": [
    {
      ...
    }
  ],
  "DealerDefinedServicesDiscounts": [
    {
      ...
    }
  ]
}

Если установлены оба параметра "DealerDefinedServices" и "DealerDefinedServicesDiscounts", контроллер ASP.NET получает только один из них, но другой становится нулевым. Я пытался решить эту проблему часами и, наконец, исправил ее, переименовав один из указанных параметров, потому что я думал, что, возможно, проблема в том, что параметры имеют похожие имена. Итак, какая проблема, почему контроллер не может видеть один из параметров, если у них есть имена simillar?

  • 0
    Так что проблема исправлена? Если бы у них были одинаковые имена в вашем json , как бы вы предположили, что он будет привязан к вашему классу, если один будет нулевым, а другой нет?
  • 0
    Имена не совпадают, они похожи: «DealerDefinedServices» и «DealerDefinedServicesDiscounts». Один из них становится нулевым, если оба предусмотрены. Проблема устраняется путем переименования одного из параметров в нечто новое, а не схожим с «DealerDefinedServices» на «Abc». Но мой вопрос: почему контроллер не может позволить мне использовать мои упомянутые имена?
Показать ещё 9 комментариев
Теги:
asp.net-mvc

2 ответа

1
Лучший ответ

Может быть, FormValueProvider в стандартном связующем FormValueProvider путается. Он имеет метод ContainsPrefix(String) который может быть виновником. Попробуйте переименовать второй параметр в

Dealer1DefinedServicesDiscounts

а затем повторите попытку, называя его

DealerDefinedServices1Discounts

Первый должен работать должным образом, а позднее должен воспроизводить нулевую проблему.

Причина такого поведения

Связующее устройство по умолчанию использует FormValueProvider для извлечения значения поля из запроса и размещения его в вашей модели Дилера. FormValueProvider использует методы ContainsPrefix для поиска поля в запросе в этом случае вашего объекта $ scope.model. Я предполагаю, что ContainsPrefix возвращает неверную информацию привязке модели, поскольку префикс DealerDefinedServices является общим для обоих свойств в вашей модели.

У меня недостаточно знаний о привязках к модели, чтобы прокомментировать, какова последовательность выполнения кода и почему модельное связующее делает одно свойство null.

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

Еще одна попытка попробовать - это использовать WebAPI вместо метода действий в MVC. Модельные вставки для методов Action ожидают получить объект формы (отсюда и имя FormValueProvider). Поскольку то, что вы проходите, по существу является json/javascript объектом, связывание модели WebAPI может быть более эффективным в привязке к нему. Примечание. Я не пробовал это, у WebAPI может быть такая же проблема.

0

Это ошибка в MVC4. Быть осторожен. http://aspnetwebstack.codeplex.com/workitem/616

Ещё вопросы

Сообщество Overcoder
Наверх
Меню