Сначала я использую 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)
}
Проблема с вашим кодом заключается в том, что 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/
IList
и используйте indexing@Html.HiddenFor(m => m.Account_Level[i].AccountId)
Но это кажется бессмысленным - гораздо лучше получить коллекции на сервере после отправки, чем делать это.