Как создать ссылку с контроллера на бритву? - PullRequest
0 голосов
/ 17 февраля 2019

Мне нужно создать ссылку типа строка из моего контроллера 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 равен нулю.Это работает от кода страниц бритвы позади, но не от контроллера.От контроллера UrlHelper наследуется от ControllerBase и от бритвы PageModel, поэтому есть две разные реализации.Но как мне заставить работать контроллер urlhelper, чтобы я мог создать ссылку на razorpages?

(Еще одна, немного другая проблема, как правильно сгенерировать такие ссылки из библиотек классов вне контроллеров?),

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Я не могу воспроизвести вашу проблему.У меня есть этот код внутри контроллера 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
    });
}

Кроме того, у меня есть страница Razor на /Pages/Test/Name.cshtml со следующимсодержание:

@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"}

Вместо UrlHelper, который зависит от значений окружения и, как таковой, лучше всего используется в действиях контроллера или представлениях Razor, вы также можете использоватьновый LinkGenerator.LinkGenerator, как правило, дает вам тот же опыт, что и UrlHelper, но не требует настройки окружения, поэтому его можно использовать одинаково, независимо от того, где вы на самом деле.

0 голосов
/ 17 февраля 2019

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