繁体   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