如何生成从控制器到剃须页的链接?

时间:2019-02-17 14:44:57

标签: c# asp.net-core asp.net-core-mvc razor-pages

我需要创建从我的mvc控制器到剃须刀页面的字符串类型链接。 Asp.Net Core 2.2。 我使用IUrlHelper:

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

callbackUrl为null。这从后面的剃须刀页面代码起作用,而不是从控制器起作用。 UrlHelper从控制器继承自ControllerBase和razor PageModel,因此有两种不同的实现。但是,如何使控制器urlhelper起作用,以便可以创建razorpages链接?

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

2 个答案:

答案 0 :(得分:1)

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

示例:

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

(然后在action方法中):

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

答案 1 :(得分:1)

我无法重现您的问题。我将这段代码放在MVC控制器中,该代码与生成问题中显示的网址的代码完全相同:

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相同的体验,但是不需要环境设置,因此无论您身在何处,都可以以相同的方式使用它。