如何从控制器生成 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 相同的体验,但不需要环境设置,因此无论您身在何处,都可以以相同的方式使用它。
我需要创建一个 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 相同的体验,但不需要环境设置,因此无论您身在何处,都可以以相同的方式使用它。