首页 新闻 搜索 专区 学院

asp.net mvc 给出url字符串如何获得对应的controller和action?

1
悬赏园豆:100 [待解决问题]

asp.net mvc 给出url字符串如何获得对应的controller和action?

车尘马足的主页 车尘马足 | 初学一级 | 园豆:100
提问于:2011-07-04 22:10
< >
分享
所有回答(6)
0

比如说 http://space.cnblogs.com/controller/action/  最后的是action 前一个是controller,如果你想获取可以用

substrng()截取

程序新青年 | 园豆:841 (小虾三级) | 2011-07-05 08:11
0

你的意思是在view中获取controller和action名称吧

第一种:

   获取controller名称:ViewContext.RouteData.Values["controller"]

   获取action名称:ViewContext.RouteData.Values["action"]

第二种:

   ViewContext.Controller.ValueProvider.GetValue("controller").RawValue

   ViewContext.Controller.ValueProvider.GetValue("action").RawValue

tenghai | 园豆:175 (初学一级) | 2011-07-05 08:13
你的方法是获取默认配置的,正确方法如下: ViewContext.RouteData.Route.GetRouteData(this.Context).Values["controller"] ViewContext.RouteData.Route.GetRouteData(this.Context).Values["action"]
支持(0) 反对(0) goddady | 园豆:205 (菜鸟二级) | 2011-07-26 16:11
0

这个不一定能活获取得到,因为路由重写不是固定格式。很简单的例子

http://域名/  这是首页,可是在新建的示例中,它的路由规则对应的"{controller}/{action}/{id}" 所以是不确定的

慧☆星 | 园豆:5392 (大侠五级) | 2011-07-05 09:04
0

我的意思是:给出一个url字符串,然后针对现有的路由规则获得controller和action名称。也就是分析url字符串。

挨踢8小时 | 园豆:205 (菜鸟二级) | 2011-07-05 09:10
先看看老赵的这篇文章:http://www.cnblogs.com/jeffreyzhao/archive/2009/08/19/use-the-internal-feature.html
最后的方法如下:
public ActionResult Index()
{
RouteValueDictionary kvd = GetRouteValue("Home/Index/5");
if (kvd == null)
{
Response.Write("没有匹配到任何路由!");
}
else
{
Response.Write("controller:" + kvd["controller"] + "
");
Response.Write("action:" + kvd["action"] + "
");
}
return View();
}
private RouteValueDictionary GetRouteValue(string url)
{
foreach (Route route in RouteTable.Routes)
{
var parsedRoute = RouteParser.Parse(route.Url);
var values = parsedRoute.Match(url, route.Defaults);
if (values != null)
return values;
}
return null;
}
支持(0) 反对(0) tenghai | 园豆:175 (初学一级) | 2011-07-05 11:08
0

asp.net mvc 给出url字符串如何获得对应的controller和action

这个可以通过在 Global.asax 进行路由规则的配置。

如果是想了解asp.net 的一些低层实现 可以看下这个系列的文章

http://www.cnblogs.com/zhangziqiu/archive/2009/02/27/ASPNET-MVC-1.html

fade-away | 园豆:255 (菜鸟二级) | 2011-07-05 09:11
我最后是这样实现的:
string conroller = string.Empty;
string action = string.Empty;
bool isSuc = false;
HttpRequest hr = new HttpRequest("", url, "");
TextWriter stringWriter = new StringWriter();
HttpResponse hrs = new HttpResponse(stringWriter);
HttpContext hc = new HttpContext(hr, hrs);
HttpContextWrapper hcw = new HttpContextWrapper(hc);

foreach (Route r in System.Web.Routing.RouteTable.Routes)
{
RouteData rt = r.GetRouteData(hcw);
if (rt != null)
{
isSuc = true;
conroller = rt.Values["Controller"].ToString();
action = rt.Values["Action"].ToString();
break;
}
}
支持(0) 反对(0) 挨踢8小时 | 园豆:205 (菜鸟二级) | 2011-07-05 12:56
2

微软已经提供了 非常方便的方法为什么 还要绕远路呢?

ViewContext.RouteData.Route.GetRouteData(this.Context).Values["controller"]
ViewContext.RouteData.Route.GetRouteData(this.Context).Values["action"]

goddady | 园豆:205 (菜鸟二级) | 2011-07-26 16:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册