我有一个在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。
答案 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