Razor страницы пользовательских маршрутов - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь получить следующие маршруты, поэтому у меня есть GlobalTemplatePageRouteModelConvention. Я использовал int? ограничение, чтобы отличить / 1 от обработчика / ListJson, но я не доволен этим, он без необходимости проверяет целое число для каждого маршрута. Это идеальное решение? Как я могу получить это лучше?

Страницы *; 1003 *

/Index.cshtml
/MainTestPage.cshtml
/TestDir/Index.cshtml
/TestDir/TestPage.cshtml

Обработчики;

public void OnGet(int? id)
public void OnGetListJson(int? id)

Маршруты;

"/",
"/1",
"/ListJson",
"/ListJson/1",

"/MainTestPage",
"/MainTestPage/1",
"/MainTestPage/ListJson",
"/MainTestPage/ListJson/1",

"/TestDir",
"/TestDir/1",
"/TestDir/ListJson",
"/TestDir/ListJson/1",

"/TestDir/TestPage",
"/TestDir/TestPage/1",
"/TestDir/TestPage/ListJson",
"/TestDir/TestPage/ListJson/1",

код *; 1012 *

public class GlobalTemplatePageRouteModelConvention : IPageRouteModelConvention
{
    public void Apply(PageRouteModel model)
    {
        var selectorCount = model.Selectors.Count;
        var list = new List<SelectorModel>();
        var isIndexPage = model.ViewEnginePath.EndsWith("/Index", StringComparison.OrdinalIgnoreCase);
        for (var i = 0; i < selectorCount; i++)
        {
            var selector = model.Selectors[i];
            var template = selector.AttributeRouteModel.Template;
            var isIndexRoute = template.EndsWith("Index", StringComparison.OrdinalIgnoreCase);
            if (isIndexPage)
            {
                if (isIndexRoute)
                {
                    list.Add(selector);
                }
                else
                {
                    model.Selectors.Add(new SelectorModel
                    {
                        AttributeRouteModel = new AttributeRouteModel
                        {
                            Order = -2,
                            Template = AttributeRouteModel.CombineTemplates(selector.AttributeRouteModel.Template, "{id:int?}")
                        }
                    });
                    selector.AttributeRouteModel.Order = -1;
                    selector.AttributeRouteModel.Template = AttributeRouteModel.CombineTemplates(selector.AttributeRouteModel.Template, "{handler?}/{id?}");
                }
            }
            else
            {
                model.Selectors.Add(new SelectorModel
                {
                    AttributeRouteModel = new AttributeRouteModel
                    {
                        Order = -4,
                        Template = AttributeRouteModel.CombineTemplates(selector.AttributeRouteModel.Template, "{id:int?}")
                    }
                });
                selector.AttributeRouteModel.Order = -3;
                selector.AttributeRouteModel.Template = AttributeRouteModel.CombineTemplates(selector.AttributeRouteModel.Template, "{handler?}/{id?}");
            }
        }
        foreach (var selector in list)
            model.Selectors.Remove(selector);
    }
}

builder.AddRazorPagesOptions(o => {
    o.Conventions.Add(new GlobalTemplatePageRouteModelConvention());
} 

1 Ответ

0 голосов
/ 16 мая 2018

Наконец, я предпочитаю придерживаться соглашения о шаблонах маршрутов, чтобы исключить ограничения int и из-за них не снизилась производительность.

  • Шаблоны указываются глобально, не указывается в директиве @page каждой страницы.
  • Индексные маршруты (/ Index / 1) предназначены для неназванных обработчиков, OnGet и т. Д.
  • Работает на следующих маршрутах;
"/",
"/Index/1",
"/ListJson",
"/ListJson/1",

"/MainTestPage",
"/MainTestPage/Index/1",
"/MainTestPage/ListJson",
"/MainTestPage/ListJson/1",

"/TestDir",
"/TestDir/Index/1",
"/TestDir/ListJson",
"/TestDir/ListJson/1",

"/TestDir/TestPage",
"/TestDir/TestPage/Index/1",
"/TestDir/TestPage/ListJson",
"/TestDir/TestPage/ListJson/1",
  • GlobalTemplatePageRouteModelConvention;
    • Индексный маршрут вызывает несоответствия, поэтому он удаляется.
builder.AddRazorPagesOptions(o =>
{
    o.Conventions.Add(new GlobalTemplatePageRouteModelConvention());
});


public class GlobalTemplatePageRouteModelConvention : IPageRouteModelConvention
{
    public void Apply(PageRouteModel model)
    {
        var isIndexPage = model.ViewEnginePath.EndsWith("/Index", StringComparison.OrdinalIgnoreCase);

        foreach (var selector in model.Selectors.ToList())
        {
            var template = selector.AttributeRouteModel.Template;
            if (isIndexPage)
            {
                var isIndexRoute = template.EndsWith("Index", StringComparison.OrdinalIgnoreCase);
                if (isIndexRoute)
                {
                    model.Selectors.Remove(selector);
                    continue;
                }
            }
            selector.AttributeRouteModel.Template =
                AttributeRouteModel.CombineTemplates(template,
                    "{handler?}/{id?}");
        }
    }
}
...