. NET CORE Изменить выбранный элемент SelectList в контроллере возможная ошибка? - PullRequest
0 голосов
/ 08 мая 2020

Я думаю, что нашел ошибку в ядре. net .. но я не уверен. Существует сценарий, в котором я хочу обновить выбранное значение в списке выбора на основе значения, которое пользователь выбирает для ДРУГОГО списка выбора.


        public async Task<IActionResult> Test(MusicModelView music)
        {
            if(music.GenreId == 2)
            {
                music.ArtistId = 4;
            }

            ViewData["Artists"] = new SelectList(GetArtists(), "Id", "Name", music.ArtistId);
            ViewData["Genres"] = new SelectList(GetGenres(), "Id", "Name", music.GenreId);

            return View(music);
        }

        private IEnumerable<Artist> GetArtists()
        {
            IList<Artist> artists = new List<Artist>();
            artists.Add(new Artist() { Id = 1, Name = "Bob" });
            artists.Add(new Artist() { Id = 2, Name = "Tom" });
            artists.Add(new Artist() { Id = 3, Name = "Mike" });
            artists.Add(new Artist() { Id = 4, Name = "Welly" });
            return artists;
        }

        private IEnumerable<Genre> GetGenres()
        {
            IList<Genre> genres = new List<Genre>();
            genres.Add(new Genre() { Id = 1, Name = "Drama" });
            genres.Add(new Genre() { Id = 2, Name = "Drum N Base" });
            genres.Add(new Genre() { Id = 3, Name = "Rock" });
            genres.Add(new Genre() { Id = 4, Name = "Pop" });
            return genres;
        }

Это образец кода для воспроизведения этой ошибки в В приведенном выше простом примере, когда пользователь выбирает «жанр» с идентификатором 2 (барабанная база n), он должен сменить исполнителя.

MusicViewModel

    public class MusicModelView
    {
        [Key]
        public int Id { get; set; }
        public int GenreId { get; set; } = 3;
        public int ArtistId { get; set; } = 3;
    }

Модели исполнителя / жанра:

    public class Artist
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class Genre
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

ПРОСМОТР:

@model MusicModelView

<h4>MusicModelView</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Test">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <input type="hidden" asp-for="Id" />
            <div class="form-group">
                <select asp-for="GenreId" asp-items="ViewBag.Genres" class="form-control">
                    </select>
            </div>
            <div class="form-group">
                @Html.DropDownList("ArtistId", ViewBag.Artists as SelectList)
                @Html.DropDownList("Artists2", ViewBag.Artists as SelectList)
            </div>
            <div class="form-group">
                <input type="submit" value="Save" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

Теперь я пробовал разными способами поэкспериментировать с этим, и, как вы можете видеть, я включил 2 поля выбора с одинаковым списком элементов, но с разными именами. ...

Один из них имеет то же имя, что и связанный int в модели (ArtistId), а другой просто называется «Artists2».

Если вы измените первый список выбора (ArtistId) оба списка обновятся нормально.

ОДНАКО, если вы измените жанр и разрешите методу контроллера обновлять выбранный элемент (например, только если жанр == 2

            if(music.GenreId == 2)
            {
                music.ArtistId = 4;
            }

Тогда единственный выберите поле это обновление s - это тот, который называется "Artists2", тогда как тот, который связан с моделью, сохраняет предыдущее значение ....

Кто-нибудь знает, как это можно настроить, чтобы оно правильно обновляло поле выбора для ( ArtistId) one?

Большое спасибо,

Phil.

...