【问题标题】:How to generate a link from controller to razorpages?如何生成从控制器到 razorpages 的链接?
【发布时间】:2019-07-11 01:48:15
【问题描述】:

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

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

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

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

【问题讨论】:

  • ASP.NET Core 2.2 项目?
  • 是的,这是 2.2
  • 您通常可以使用新的LinkGenerator 生成应用程序中任何页面或操作的 URL。即使在库中(那些应该将生成器作为依赖项)。
  • linkgenerator 看起来很有希望,@poke !我会调查的!它可能只是解决我生活中的所有问题
  • @ErikPhilips 拥有同时使用 MVC 和 Pages 的混合环境是完全受支持且不太可能的情况。这真的没有错。

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


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

【讨论】:

  • 你可能是对的!我可能写错了参数。一个很难看出是否是这种情况的错误(并且为浪费时间而感到尴尬)。我明天会研究一下,然后
【解决方案2】:

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 });

【讨论】:

  • 问题是 LinkGenerator not working for Razor Page 从控制器方法。实际上 OP 正在尝试从控制器方法生成 Razor 页面的链接。
  • @TanvirArjel 我在控制器方法中使用它没有问题(这是 OP 要求的:“从我的 mvc 控制器到剃刀页面”):为什么你说它不起作用?
  • 是的!对于控制器操作方法,它工作正常,但不适用于 Razor 页面路由。
  • 那么问题就解决了,因为 OP 显然正在寻找一种可以在 MVC 控制器中使用的方法。顺便说一句,对于 razor 页面,您可以继续使用现有的 @Url.Action API,它现在在内部使用新方法(从 ASP.NET Core 2.2 预览版 3 开始)。
  • 你搞错了!将在 MVC 控制器方法中生成,但路由实际上是 Razor Page 路由。它不工作!
猜你喜欢
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 2011-01-08
相关资源
最近更新 更多