如何从控制器生成 link 到 razorpages?

How to generate a link from controller to razorpages?

我需要创建一个 link 从我的 mvc 控制器到 razor 页面的字符串类型。 Asp.Net 核心 2.2。 我使用 IUrlHelper:

int number = 4;
string callbackUrl = Url.Page(
   "/Test/Name",
   pageHandler: null,
   values: new { number },
   protocol: Request.Scheme);

回调网址为空。这适用于剃须刀页面代码,但不适用于控制器。 UrlHelper 从控制器继承自 ControllerBase 和 razor PageModel,因此有两种不同的实现。但是我怎样才能让控制器 urlhelper 工作,以便我可以创建一个 razorpages link?

(另一个稍微不同的问题是,如何以一种好的方式从控制器外部的 class 库生成这样的 link?)。

ASP.NET Core 2.2 引入了新的 LinkGenerator 服务,一个可以在 HTTP 调用上下文之外调用以生成 URL 字符串的单例。

示例:

public class SampleController : ControllerBase
{
  protected readonly LinkGenerator _linkGenerator;
  / ...

(然后,在操作方法中):

return _linkGenerator.GetPathByAction(
     httpContext,
     controller: "Home",
     action: "Index",
     values: new { id=1 });

我无法重现您的问题。我在 MVC 控制器中有这段代码,它与生成问题中显示的 URL 的代码完全相同:

public IActionResult Test()
{
    int number = 4;
    string callbackUrl = Url.Page(
        "/Test/Name",
        pageHandler: null,
        values: new { number },
        protocol: Request.Scheme);

    return Json(new
    {
        callbackUrl
    });
}

此外,我在 /Pages/Test/Name.cshtml 有一个 Razor 页面,内容如下:

@page "{number}"
Hello @RouteData.Values["number"]!

注意路由参数 number 的规范,它与控制器内 Url.Page 调用中给定的路由参数匹配。

如果我 运行 该应用程序并打开 http://localhost:5000/Home/Test,那么我会得到以下响应,这正是我希望生成的响应:

{"callbackUrl":"http://localhost:5000/Test/Name/4"}

如果您看到的是 null,则路由值 number 可能与您的 Razor 页面中的参数不匹配。在这种情况下,路由找不到匹配的 Razor 页面。

如果您有一个未参数化的 Razor 页面(即 @page 没有参数),MVC 操作的响应应如下所示,其中路由值作为查询参数提供:

{"callbackUrl":"http://localhost:5000/Test/Name?number=4"}

您还可以使用新的 LinkGenerator,而不是依赖环境值的 UrlHelper,因此最适合在控制器操作或 Razor 视图中使用。 LinkGenerator 通常会为您提供与 UrlHelper 相同的体验,但不需要环境设置,因此无论您身在何处,都可以以相同的方式使用它。