Показать имя собственности на отношения иностранного - PullRequest
0 голосов
/ 28 января 2019

У меня есть selectList of Foreignkey (как родительский).В настоящее время идентификатор связан для значения и имени элемента.Я хочу изменить это для моего свойства Name:

Вот мои модели:

public class Genus
    {
        public int GenusID { get; set; }
        public EnumCategory Category { get; set; }
        public string Name { get; set; }

        public List<Species> Species { get; set; }
    }
public class Species
    {
        public int SpeciesID { get; set; }

        public int GenusID { get; set; }
        public virtual Genus Genus { get; set; }

        public string Name { get; set; }
    }

На моей странице создания и редактирования видов у меня есть этот код:

<select asp-for="Species.GenusID" class ="form-control" asp-items="ViewBag.GenusID"></select>

Этот код генерируется по умолчанию, когда мы добавляем Razor Page Scaffold.Ну, результат находится в строке 1, а то, что я хочу получить от результата в строке 2:

<option selected="selected" value="1">1</option>
<option selected="selected" value="1">NameProperty</option> <!-- Species.Genus.Name -->

У вас есть идея сделать это правильно?

Спасибо за аванс

1 Ответ

0 голосов
/ 03 мая 2019

Глядя на код для класса NavigationMetadata в репозитории scaffolding (https://github.com/aspnet/Scaffolding) Я обнаружил следующий закомментированный код, который описывает поведение.

// The default for the display property is the primary key of the navigation. 
DisplayPropertyName = PrimaryKeyNames[0];

// If there is a non nullable string property in the navigation's target type, we use that instead. 
var displayPropertyCandidate = navigation
    .GetTargetType()
    .GetProperties()
    .FirstOrDefault(p => !p.IsNullable && p.ClrType == typeof(string));

if (displayPropertyCandidate != null)
{
    DisplayPropertyName = displayPropertyCandidate.Name;
}

Так что если вы хотите свойство Nameпоказать по умолчанию вместо идентификатора, затем убедиться, что это первое строковое свойство в модели (ваше уже есть), а затем убедитесь, что оно не имеет значения null.

protected override void OnModelCreating(ModelBuilder builder)
{
    // ...
    builder.Entity<Genus>().Property(l => l.Name).IsRequired();
    // ...
}
...