2009-12-30 18 views
0

在尝试返回视图之前是否可以确定控制器是否存在?在我的scenerio中,我的URL中的动作值表示用户创建的值,而id表示控制器。即MVC用户创建值 - 反射是我唯一的希望吗?

http://mysite.com/systems/WIN1234/Configure 

...其中WIN1234动态路由到配置行动。因为我想继续我的网址完全破解的,我想,以确定是否配置依旧存在......

return View(action) 

...采取行动时,我在含配置字符串传递。

我脑海中浮现的第一件事就是使用反射来观察程序集,但是在我走到那么远之前,并且由于我在MVC中弄湿了耳朵,我想知道是否有更优雅的方式来制作这个决心。即...类似于:

if(DoesControllerExist(action)) return View(action) 

...其中DoesControllerExist是内置的MVC功能。

您有没有专家有任何想法?

感谢, 乔治

回答

2

我不知道我让你完全正确的,但是这是您的情况:

 
http://mysite.com/systems/WIN1234/Configure 

应该去

public class SystemsController : Controller 
{ 
    public ActionResult Configure(string theValue) //<== This would be "WIN123" in your example 
    { 
     return View(theValue); 
    } 
} 

希望在何处请确保存在以下视图:

 
YourMVCProject 
    | 
    +- Views 
     | 
     +- Systems 
      | 
      +- theValue.aspx 

在这种情况下,你可以使用:

private bool ViewExists(string name) 
{ 
    return ViewEngines.Engines.FindView(ControllerContext, name, null).View != null; 
} 

,并改变你的行动:

public ActionResult Configure(string theValue) //<== This would be "WIN123" in your example 
{ 
    if(ViewExists(theValue)) 
    { 
     return View(theValue); 
    } 
    return View(fallBackView); 
} 

免责声明:所有徒手代码

0

我想你可能会困惑,如何路由系统工作。

URL被映射到控制器和操作。如果没有匹配的控制器和操作,您将得到一个HTTP 404.

谢天谢地,URL路由(当然还有控制器)是可测试的,因此您可能只需要write unit tests for your routing configuration

另一方面,你可能不希望多个URL映射到相同的内容,而不会发出一个HTTP 301(永久移动),因为它对你的PageRank有效。

+0

路由部分不是问题,我的自定义路由设置正确,以查看我的新的URL结构。我只是不希望404存在时,我可以拦截不良请求,并将其指向相应的视图。 :) – 2009-12-30 14:53:08