如何在没有查询字符串或 Id 部分的情况下获取 URL?

How to get the URL without the Query String or the Id part?

假设我的网址是:

https://www.mywebsite.com/app/company/employees/5
https://www.mywebsite.com/app/company/employees?id=5&name=jack
https://www.mywebsite.com/app/company/employees/5?clockId=1

我正在寻找获取 "base" 路径或任何名称的方法。就像 "base" 路径对所有人来说都是“/app/company/employees”,没有“/5”部分或“?id=5&name=jack”或“/5?clockId=1”部分。

我使用 string.Join("/", context.Request.ApplicationPath, context.Request.RequestContext.RouteData.Values["controller"], context.Request.RequestContext.RouteData.Values["action"]) 来获取它(上下文是 HttpContext),但它无法按我想要的方式工作,因为它也包含索引操作。就像 Url 是“https://www.mywebsite.com/app/company”,我想要“/app/company/”而不是“/app/company/Index”。我总是可以检查操作是否为索引,但对我来说感觉有点像 "code smell"。

同样使用 context.Request.Url.AbsolutePath 也不起作用,因为它 returns “/app/company/employees/5”(它 returns 带有 Id 的路径)

看起来您需要从 URL 获得的唯一两件事是 actioncontroller,如果操作是 "index",则您不需要它。在这种情况下,我相信你做对了。这是我在 ASP.NET MVC 项目中使用的一段稍微修改过的代码:

string actionName = this.ControllerContext.RouteData.Values["action"].ToString();
string controllerName = this.ControllerContext.RouteData.Values["controller"].ToString();
if (actionName.Equals("index", StringComparison.InvariantCultureIgnoreCase))
{
    actionName = string.Empty;
}
string result = $"/{controllerName}/{actionName}";

还有一件事要提:"areas"。一旦我在拥有它们的网站上工作,那么如果您的网站使用 "area" 方法,它们也可能会出现在您的 URL 中。

希望对你有帮助