Razor Page Routing так же, как в веб-API - PullRequest
0 голосов
/ 17 октября 2018

Я создаю веб-приложение с Razor Pages.У меня есть 2 модели с отношением один ко многим: одна List может содержать много Records.

  public class List
{
    public int ID { get; set; }

    [StringLength(25, MinimumLength = 3, ErrorMessage = "Title should be in range between 3 and 25")]
    [Display(Name = "Title")]

    public string Caption { get; set; }

    public string UserId { get; set; }
    public User User { get; set; }

    public ICollection<Record> Records { get; set; }
}

 public class Record
{
    public int ID { get; set; }
    [StringLength(25, MinimumLength = 3, ErrorMessage = "Word should be in range between 3 and 25")]
    [Display(Name = "Title")]

    public string Word { get; set; }
    [StringLength(30, MinimumLength = 3, ErrorMessage = "Translation should be in range between 3 and 30")]
    public string Translation { get; set; }

    public int ListId { get; set; }
    public List List { get; set; }
}

Мне нужно аналогичным образом перейти от элемента List к списку Recordкак это возможно в веб-API или в MVC.В документации Microsoft я нашел страницу о атрибутах в Web Api , о том, что мне нужно:

[Route("customers/{customerId}/orders")]
public IEnumerable<Order> GetOrdersByCustomer(int customerId) { ... }

Мне нужно что-то вроде этого:

  [Microsoft.AspNetCore.Mvc.Route("Lists/{listId}/Records")]
    public async Task GetRecordsByList(int listId)
    {

        var allRecords = await _context.Record.ToListAsync();

        Record = allRecords.Where(w => w.ListId == listId).ToList() ;

    }

IЯ уверен, что возможно обеспечить навигацию от родительской модели List к дочерним элементам. Список Record.

Интерфейс будет выглядеть следующим образом: Из списков enter image description here

Перейдите к записям: enter image description here

Желаемый URL должен быть таким:

enter image description here

Я уверен, что кто-то сталкивался с той же проблемой и исправил ее!Буду очень признателен за любую помощь или совет.

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Окончательное решение, основанное на ответе Майк Бринд выглядит так:

  1. Я переместил папку «Записи» в списки: enter image description here

  2. Ссылка для перехода к записям из родительской ссылки определяется следующим образом:

    Подробности

enter image description here

URL-адрес для списков страниц / записей / индекса был переопределен на:

@ page "/ Lists / {id} / Records"

Подпись дляметод OnGetAsync был изменен: int?id теперь обнуляется.

public async Task OnGetAsync (int? id) {...}

Теперь URL выглядит так, как мне нужно:

enter image description here

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 18 октября 2018

Razor Pages использует атрибут маршрутизации по умолчанию.Маршруты генерируются из файловых путей отдельных страниц.Вы можете указать параметры для маршрутов, но вы делаете это для конкретной страницы, добавляя шаблон маршрута в директиву @page.

Первая отображаемая страница может быть страницей с именем Списки.cshtml или страницу с именем Index.cshtml в папке Lists .В любом случае, он будет доступен на domain.com/lists с использованием маршрутизации по умолчанию.Вторая страница может быть страницей с именем Details.cshtml с шаблоном переопределения маршрута "/Lists/{listid}/Records":

@page "/Lists/{listid}/Records"

Или вы можете использовать AddPageRouteпри запуске добавьте другой маршрут, по которому можно добраться до страницы индекса:

services.AddMvc().AddRazorPagesOptions(options =>
{
    options.Conventions.AddPageRoute("/Lists/Index", "Lists/{listid}/Records");
});

Хотя для этого потребуется код в индексе, чтобы определить, должен ли он отображать все списки или сведения о выбранном списке.

Лично я рекомендую первый подход.В Razor Pages вы должны стремиться удерживать каждую страницу до одной ответственности.

Подробнее о маршрутизации Razor Pages можно узнать здесь: https://www.learnrazorpages.com/razor-pages/routing

...