【问题标题】:Resolving action URL from action method in .NET Core MVC从 .NET Core MVC 中的操作方法解析操作 URL
【发布时间】:2018-02-12 12:24:52
【问题描述】:

我有这样的控制器代码:

[Route("api/[controller]")]
public class ValuesController : Controller
{
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    [HttpGet("[action]")]
    public IEnumerable<string> Foo()
    {
        return new string[] { "value1", "value2" };
    }
}

我想找到这些方法的 URL,使用反射或类似 nameof 的方法。 如果它可以从应用程序的任何地方调用,或者至少在中间件中能够通过操作过滤请求,那就太好了。

我希望看到的结果是:

  • 对于GetUrl(ValuesController.Get),我会得到api/Values
  • 对于GetUrl(ValuesController.Foo),我会得到api/Values/Foo

我不需要完全这种形式的这些 URL,它们可能在前面有 / 或没有等等。但我想知道这是否有可能,无论是在运行时还是在编译时。

【问题讨论】:

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


    【解决方案1】:

    UrlHelper 的 Action 功能就是你要找的:

    UrlHelper u = new UrlHelper(this.ControllerContext.RequestContext);
    string url = u.Action(varControllerNameUsingReflection, varActionNameUsingReflection, null);
    

    【讨论】:

    • 但是我必须从这个控制器名称中手动删除Controller 部分。还是不行?
    • 是的,但前提是它以“Conttoller”结尾
    • 此语法在 .NET Core MVC 中不起作用,它似乎是来自完整 .NET Framework 的方法。此外,这需要在 MVC 中间件中运行,从而使您的解决方案与我的问题无关。
    • @DominikSzymański 那你为什么要在你的问题中添加与 mvc 相关的标签?我的解决方案与您的问题有关,参考相关标签。顺便说一句,UrlHelper 也包含在 asp.net 核心中:docs.microsoft.com/en-us/dotnet/api/…
    • 因为 .NET Core MVC 仍然是 .NET MVC,只是更新版本。是的,它包含在 .NET Core 中,但工作方式有点不同,不能在 MVC 中间件之外注入。我正在使用 MVC,但我也希望能够在其他地方检索 URL,例如其他中间件、服务等。
    【解决方案2】:

    如果您在同一个控制器中有操作,并且您还想获得完整的 URL:

    var notificationUrl = this.Url.Action(
                    nameof(ControllerActionMethod),
                    this.ControllerContext.ActionDescriptor.ControllerName,
                    null,
                    this.HttpContext.Request.Protocol,
                    this.HttpContext.Request.Host.ToString())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多