2012-01-03 52 views
6

有沒有辦法將這些縮小到只有一個組結果?我有一組這樣的頁面,它們只是返回靜態內容,並且認爲必須有一種更有效的方式來實現它。我可以簡化返回視圖的代碼嗎?它似乎很冗餘

public ActionResult Research() 
    { 
     return View(); 
    } 

    public ActionResult Facility() 
    { 
     return View(); 
    } 

    public ActionResult Contact() 
    { 
     return View(); 
    } 

編輯:感謝所有的答覆:)

+0

這是什麼編碼? – 2012-01-03 21:48:57

+0

這是來自微軟的ASP.NET MVC3框架的控制器中的代碼。 – 2012-01-03 21:50:09

+3

您可以刪除換行符。 – SLaks 2012-01-03 21:51:23

回答

9

你可以做一個共同行動的方法,需要一個viewName參數:

public ActionResult Show(string viewName) 
{ 
    return View(viewName); 
} 

然後,您可以路線的名字這個動作:

routes.MapRoute(
    "Simple Content", 
    "/{viewName}", 
    new { controller = "Something", action = "Show" }, 
    new { viewName = "Research|Facility|Contact" } 
); 

需要viewName約束來防止是匹配任意URL的路由。

請注意這是一個信息泄漏漏洞;攻擊者可以要求/ControllerName/Show?viewName=~/Views/Secret/View
如果您有任何不使用模型的機密視圖,則應在動作中驗證viewName
爲此,您可以使用枚舉,如dknaack's answer

+4

你打敗了我。我認爲這實際上不太直觀,可擴展性較差,我個人會保留原樣(OP)。 – LukeP 2012-01-03 22:00:05

2

您可以創建一個將採取只controllername/{path}一條新的路徑,該路徑將是您的視圖的名稱,然後在控制器中的操作是這樣的

public ActionResult Page(string path) 
{ 
    return View(path); 
} 

所以打算這條路

yourdomain.com/controllername/Ijusttest將從~/Views/controllername/Ijusttest.cshtml加載視圖。您只需確保通過路線呼叫您的行動。

我希望這是有道理的。您可以對其進行不同的設置,完全取決於您創建的路由。讓我知道如果你需要幫助的路線代碼。

0

您可能想要創建一個動作,並傳遞一個參數頁面名稱,例如

public StaticContent : Controller 
{ 
    public ActionResult Pages(string id) 
    { 
    return View(id); 
    } 
} 

其中id的值可以是「研究」,「設施」,等等。

你會得到像這樣的網址/ staticcontent/pages/research

只需在StaticContent文件夾的Research.cshtml中命名視圖爲例。