簡體   English   中英

帶參數的ASP.NET Core Razor頁面路由

[英]ASP.NET Core Razor Pages Routing With parameters

我有一個簡單的頁面,用戶可以在其中基於開始和結束日期搜索記錄,“參考”和“客戶”字段是可選的

在詳細信息頁面上,我有這個

@page "{datestart}/{dateend}/{referenceId?}/{client?}"

在搜索頁面上,我有這個帖子處理程序

    public IActionResult OnPost()
    {
        if (!ModelState.IsValid)
        {
            var options = new MemoryCacheEntryOptions() { AbsoluteExpiration = DateTime.Now.AddMinutes(10) };
            ViewData["ReferenceId"] = new SelectList(_context.Referencias.AsNoTracking().FromCache(), "Id", "Name");

            return Page();
        }

        return RedirectToPage("Details", new
        {
            datestart= SearchViewModel.DateStart.ToString("dd-MM-yyyy"),
            dateend = SearchViewModel.DateEnd.ToString("dd-MM-yyyy"),
            referenceId = SearchViewModel.ReferenceId,
            client = SearchViewModel.Client
        });
    }

但是,除非“引用”字段為null,否則一切正常

在我的詳細信息頁面上

  public void OnGet(string datestart, string dateend, int? referenceId, int? client)

預期的結果是,如果我確實提供了客戶端,那么如果我不提供referenceId事件,我將能夠轉到詳細信息頁面。

日期始終是必需的。

因此,即使沒有提供referenceId但仍提供client,我仍然可以路由嗎?

我所得到的只是這個例外

InvalidOperationException:沒有名為“ Details”的頁面與提供的值匹配。 Microsoft.AspNetCore.Mvc.Infrastructure.RedirectToPageResultExecutor.ExecuteAsync(ActionContext上下文,RedirectToPageResult結果)Microsoft.AspNetCore.Mvc.RedirectToPageResult.ExecuteResultAsync(ActionContext上下文)Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultAsync(IActionCoreResult結果) Mvc.Internal.ResourceInvoker.InvokeNextResultFilterAsync()Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResultExecutedContext context)Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.ResultNext(ref next next,ref Scope scope,ref object state,ref bool已完成)Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeResultFilters()Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)Microsoft.AspNetCore。 .ResourceInvoker.Next(下一個ref狀態,ref作用域范圍,ref對象狀態,ref bool isCompleted)Microsoft.AspNetC ore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)Microsoft.AspNetCore.Routing.EndpointRookeMiddleware.Invoke Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext上下文)Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext上下文)NToastNotify.NtoastNotifyAjaxToastsMiddleware.InvokeAsync(HttpContext上下文,RequestDelegate下一個)Microsoft.AspNetCore <5 > d.MoveNext()Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext上下文)Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext上下文)

我也嘗試切換{referenceId?}和{client?}的順序,它可以正常工作,但是如果我對referenceId做同樣的操作,它將失敗。

UPDATE

根據@Nick的建議,我再次嘗試了多條路線,但第二條路線除外,如果它是唯一一條,它就不會路線。

options.Conventions.AddAreaPageRoute("Production","/BackOffice/Account/Records/Details", "{datestart}/{dateend}/{client?}");
             options.Conventions.AddAreaPageRoute("Production", "/BackOffice/Account/Records/Details", "{datestart}/{dateend}/{referenceId?}");
             options.Conventions.AddAreaPageRoute("Production", "/BackOffice/Account/Records/Details", "{datestart}/{dateend}/{client?}/{referenceId?}");

可能是一種奇怪的方法,但是您可以使用AddPageRoute方法添加其他根。

    services.AddMvc().AddRazorPagesOptions(options =>
    {
       options.Conventions.AddPageRoute("/details", "{datestart}/{dateend}/{client?}");
    });

如果您需要能夠同時提供referenceidclientid或兩者,則可以將第一個參數設為必需並傳入0,或者可以使用查詢字符串。 否則就沒有辦法路由知道,如果42上月底/details/2019-8-15/2019-8-16/42是一個clientidreferenceid值。

如您所知,就路由而言

"{datestart}/{dateend}/{client?}"

是相同的

"{datestart}/{dateend}/{referenceid?}"

並將生成一個AmbiguousActionException

如果要使第一個參數為必需,則執行方法如下:

@page "{datestart}/{dateend}/{referenceid:int=0}/{client?}"

除非提供了另一個值,否則標記幫助程序內部生成的任何鏈接都將自動用0填充referenceid段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM