Компонент динамического просмотра ASP.NET

Я пытаюсь сделать веб-приложение похожим на викию для tvshows, чтобы укрепить мои навыки.NET (в данном случае MVC Core). Это веб-приложение, однако, скрывает информацию об эпизодах, которые вы еще не смотрели.

Я хочу поместить 2 ползунка (сезон и эпизод) поверх большинства страниц, используя компонент просмотра. При изменении значений ползунков текущая страница должна обновиться, но сохранить текущие фильтры.

Я никогда раньше не работал с компонентами представления в.NET, возможно ли это или есть лучший способ сделать это?

Просмотр компонентов

public class EpisodeSliderViewComponent:ViewComponent
{
    private readonly IEpisodeRepository _episodeRepository;

    public EpisodeSliderViewComponent(IEpisodeRepository episodeRepository)
    {
        _episodeRepository = episodeRepository;
    }

    public Task<IViewComponentResult> InvokeAsync(int tvShowId, string controllerName)
    {
        IQueryable<Episode> episodes = _episodeRepository.GetByTvShow(tvShowId);
        int seasonNr = HttpContext.Session.GetInt32($"{tvShowId}:SeasonNr") ?? 0;
        int episodeNr = HttpContext.Session.GetInt32($"{tvShowId}:EpisodeNr") ?? 0;

        return Task.FromResult<IViewComponentResult>(View(new EpisodeSliderViewModel(tvShowId, episodes, seasonNr, episodeNr, controllerName)));
    }
}

Посмотреть модель

public class EpisodeSliderViewModel
{
    public int TvShowId { get; set; }
    public int NrOfSeasons { get; private set; }
    public int SeasonNr { get; set; }
    public int[] NrOfEpisodes { get; set; }
    public int EpisodeNr { get; set; }
    public string ControllerName { get; private set; }

    public EpisodeSliderViewModel() { }

    public EpisodeSliderViewModel (int tvShowId, IQueryable<Episode> episodes, int seasonNr, int episodeNr, string controllerName)
    {
        TvShowId = tvShowId;
        SeasonNr = seasonNr;
        EpisodeNr = episodeNr;
        ControllerName = controllerName;

        NrOfSeasons = episodes.Select(e => e.SeasonNr).Max();
        NrOfEpisodes = new int[NrOfSeasons+1];
        for (int i = 1; i <= NrOfSeasons; i++)
        {
            NrOfEpisodes[i] = episodes.Where(e => e.SeasonNr == i).Select(e => e.EpisodeNr).Max();
        }
    }
}

Просмотр HTML компонента

<form asp-controller="@Model.ControllerName" asp-action="Range" id="episodeForm">
???asp-controller/asp-action are not fixed, i was just trying somthing
  <input type="hidden" asp-for="TvShowId" />
  Season: @Model.SeasonNr
  <input asp-for="SeasonNr" type="range" min="0" max="@Model.NrOfSeasons" step="1" id="seasonSlider" />
  Episode: @Model.EpisodeNr
  <input asp-for="EpisodeNr" type="range" min="0" max="@Model.NrOfEpisodes[Model.SeasonNr]" step="1" id="episodeSlider" />
</form>

Список эпизодов HTML (необходимый фильтр)

<form asp-controller="Episodes" asp-action="Index">
  <p>
    <input type="hidden" asp-for="TvShowId" />
    Season: <select asp-for="SeasonFilter" asp-items="Model.Seasons"></select>
    <button type="submit">
        <span class="glyphicon glyphicon-search"></span>
    </button>
  </p>
</form>

0 ответов

Другие вопросы по тегам