我需要创建从我的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链接?
(另一个稍微不同的问题是,如何以一种很好的方式从控制器外部的类库生成这样的链接?)。
答案 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相同的体验,但是不需要环境设置,因此无论您身在何处,都可以以相同的方式使用它。