是否有可能根据网址获取控制器和操作(不是他们的名字!!)?

时间:2011-06-01 14:19:48

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing url-routing

我找到了几十个关于根据url获取控制器名称和方法的线程,我也是这样做的。我可以从MVC引擎自动获取方法的MethodInfo,还是我必须Type.GetType("Namespace.Controllers."+cname+"Controller").GetMethod(mname)?哪个不太好,因为我怎么知道框架类中的命名空间?我如何知道是否正在观察默认命名模式,或者是否使用了不同的配置?  我想得到一个“ MVC会执行什么?”的结果.... 有可能吗?

编辑:进一步信息:
我有一个框架,它使用可翻译的,数据驱动的网址,并有一个自定义网址重写。现在,当我想要显示新闻对象的网址时,它完美无缺,我只需要写@Url.Content("~/"+@Model.Link),并在网址中显示“SomeNewsCategory / SomeNews”而不是“News / 29”,而无需更改RouteTable.Routes动态。但是,当我尝试将RedirectToAction("SomeStaticPage","Contact");写入控制器时,反过来会出现问题。为此,我需要在db中注册一个静态链接,让它以“/ SomeStaticPage / Contact”为目标,然后编写 Redirect("~/"+DB.Load(linkid).Link);当我有30个这样的ID时,那就不太好了。团队中的网络程序员开始注册“假网址”,看起来像这样:

public class FakeURL
{
public string Controller;
public string Action;
public int LinkID;
}

然后他像Redirect(GetFakeUrl("controller","action"));一样使用了它,但它仍然不是很好。现在它让我思考,如果我将[Link(linkid)]属性应用于每个静态链接的方法,那么覆盖基本控制器中的RedirectToAction方法,当他写ReturnToAction("action","controller"时)时,我实际上会查找属性,加载URL等等。但是我还没有找到一种方法来根据控制器和动作的名称或者它们的URL来获取methodInfo。

编辑:我自己编写了反思, 唯一缺少的是从剃刀助手 中获取应用程序的程序集,因为CallingAssembly是.cshtml的动态编译程序集,而不是我的WebApplication。我可以以某种方式得到它吗?

2 个答案:

答案 0 :(得分:0)

要回答您的编辑,您可以编写typeof(SomeType).Assembly,其中SomeType是项目代码中定义的任何类型(例如MvcApplication,或任何模型或控制器)

此外,你可以写ControllerContext.Controller.GetType()(或ViewContext)来获取当前请求的控制器类型 编辑这不是你的'重新尝试。

答案 1 :(得分:0)

我发现这是完全错误的做法。我试图根据名称找到控制器的类型,而不是我一直都有类型。

因此,我将使用@Url.Action("SomeAction","SomeController")代替@Url.MyAction((SomeController c)=>c.SomeAction()),所以我甚至不需要找到控制器。