如何在ASP.NET MVC中获取不带参数的Action的URL

时间:2016-07-17 21:32:42

标签: c# asp.net asp.net-mvc url routes

我有一个在IIS上的虚拟目录中运行的ASP.NET MVC Web应用程序。 在应用程序中,我有一个Action,它接受一个名为Id的参数。

public class MyController : MyBaseController 
{
    public ActionResult MyAction(int id)
    {
        return View(id);
    }
}

当我使用参数123调用Action时,生成的URL如下所示:

http://mywebsite.net/MyProject/MyController/MyAction/123

基本控制器中,如何在没有任何参数的情况下优雅地找到Action的URL?我想要获得的字符串是:/MyProject/MyController/MyAction

还有其他问题,但他们没有涉及这些案件。例如Request.Url.GetLeftPart仍然给我Id。

4 个答案:

答案 0 :(得分:3)

@ trashr0x的答案解决了问题的最大部分,但错过了MyProject部分,并且不需要字典来构造问题字符串。这是一个简单的解决方案:

var result = string.Join("/", new []{ 
    Request.ApplicationPath, 
    RouteData.Values["controller"], 
    RouteData.Values["action"] 
});

答案 1 :(得分:2)

您是否已在默认路由中指定id设置为可选(UrlParameter.Optional)?

routes.MapRoute(
    // route name
    "Default",
    // url with parameters
    "{controller}/{action}/{id}",
    // default parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

更新#1:以下是两个解决方案,一个用于id是查询字符串(?id={id}),另一个用于Uri({{{ 1}}):

/{id}/

更新#2:好的,所以这是另一个去吧。它适用于所有方案(var localPath = Request.Url.LocalPath; // works with ?id=123 Debug.WriteLine("Request.Url.LocalPath: " + localPath); // works with /123/ Debug.WriteLine("Remove with LastIndexOf: " + localPath.Remove(localPath.LastIndexOf('/') + 1)); ?id=?id=123/),并且我已将操作签名中的/123/更改为{ {1}}而不是Id(需要重构):

int?

答案 2 :(得分:1)

您是否尝试过以下操作:

string actionName = HttpContext.Request.RequestContext.RouteData.Values["Action"].ToString();
string controllerName = HttpContext.Request.RequestContext.RouteData.Values["Controller"].ToString();
var urlAction = Url.Action(actionName, controllerName, new { id = "" });

答案 3 :(得分:0)

试试这个:

Request.Url.AbsoluteUri.Replace(Request.Url.Query, String.Empty);

但如果没有查询字符串

,则会出错

所以,您也可以直接尝试:

Request.Url.AbsoluteUri