2009-12-30 57 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

相關問題