MVC - свойство привязки ICollection

1

Сначала я использую MVC и EF DB. Мои модели созданы EF. В моей модели у меня есть два свойства типа ICollection.

Моя проблема в том, когда я отправляю свою форму, эти свойства пусты (я не отправляю их на просмотр emty)

Моя модель:

    public partial class Account
    {
        public Account()
        {
            this.Account_Level = new HashSet<Account_Level>();
            this.Account_Team = new HashSet<Account_Team>();
        }

        public long Id { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public bool IsAdmin { get; set; }

        public virtual ICollection<Account_Level> Account_Level { get; set; }
        public virtual ICollection<Account_Team> Account_Team { get; set; }
    }

Примечание. Мои свойства ICollection отсутствуют в моем представлении, но я нуждаюсь в них обратно в своем контроллере.

Редактировать:

Я добавил ниже кода к моему представлению. В моем html я вижу, что мои значения Icollection добавляются как скрытые, но когда я делаю сообщение, свойства ICollection все еще пусты. Так что я до сих пор не получаю эти ценности.

for (int i = 0; i < Model.Account_Level.Count(); i++)
{
    @Html.HiddenFor(m => m.Account_Level.ElementAt(i).AccountId)
    @Html.HiddenFor(m => m.Account_Level.ElementAt(i).Id)
    @Html.HiddenFor(m => m.Account_Level.ElementAt(i).LevelId)
}

for (int i = 0; i < Model.Account_Team.Count(); i++)
{
    @Html.HiddenFor(m => m.Account_Team.ElementAt(i).AccountId)
    @Html.HiddenFor(m => m.Account_Team.ElementAt(i).Id)
    @Html.HiddenFor(m => m.Account_Team.ElementAt(i).TeamId)
}
  • 0
    Можете ли вы объяснить, если вам это не нужно, по вашему мнению, чем тогда, когда вам нужно, чтобы они были в оба конца и снова доступны после публикации, или почему они должны быть частью модели представления?
  • 0
    Создайте коллекции IList и используйте indexing @Html.HiddenFor(m => m.Account_Level[i].AccountId) Но это кажется бессмысленным - гораздо лучше получить коллекции на сервере после отправки, чем делать это.
Показать ещё 1 комментарий
Теги:
asp.net-mvc

1 ответ

2

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

Метод HiddenFor в вашем представлении Razor генерирует что-то вроде:

<input id="AccountId" type="hidden" value="1" name="AccountId" data-val-required="The AccountId field is required." data-val-number="The field AccountId must be a number." data-val="true">

Поскольку вы видите сгенерированное имя AccountId это неверно, если вы хотите сделать его связанным.

Правильное имя должно быть чем-то вроде Account_Level[0].AccountId.

Вот полный пример правильного названия для ваших скрытых полей:

for (int i = 0; i < Model.Account_Level.Count(); i++)
{
    @Html.HiddenFor(m => m.Account_Level.ElementAt(i).AccountId, new { @Name = string.Format("Account_Level[{0}].AccountId", i) })
    @Html.HiddenFor(m => m.Account_Level.ElementAt(i).Id, new { @Name = string.Format("Account_Level[{0}].Id", i) })
    @Html.HiddenFor(m => m.Account_Level.ElementAt(i).LevelId, new { @Name = string.Format("Account_Level[{0}].LevelId", i) })
}

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

Здесь вы можете найти дополнительную информацию о соглашениях об именах ASP.NET MVC:

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/

Ещё вопросы

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