2009-06-30 54 views
5

我有以下的情況下,我想接受以下擊潰asp.net的MVC - 路線字符串或INT(即/類型/ 23或/類型/帽子)

'/type/view/23' or '/type/view/hats' 

,其中23是編號爲帽子。

控制器看起來是這樣的:

public class TypeController 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult View(int id) 
    { 
     ... 
    } 
} 

現在,如果他們在23個沒有問題通過。如果他們戴帽子,我有一些工作要做。現在我想知道在這種情況下,我會通過使用ActionFilter將帽子翻譯爲23,看看傳入的值是否爲int(如果檢查它存在於數據庫中),還是看起來像是字符串在數據庫中查找已傳入的字符串的ID。在任何情況下,如果找不到匹配項,我想將用戶重定向到不同的操作。

首先是我命名正確的方法,其次是從ActionFilter中進行重定向。

乾杯 安東尼

回答

4

更改您的簽名以接受字符串。然後檢查id的值是否爲int。如果是,則按ID查找,如果不按名稱查找。如果您找不到匹配項,請重新定向。

public class TypeController 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult View(string id) 
    { 
     Product product = null; 
     int productID = -1; 
     if (int.TryParse(id, out productID)) 
     { 
      product = db.Products 
         .Where(p => p.ID == productID) 
         .SingleOrDefault(); 
     } 
     else 
     { 
      product = db.Products 
         .Where(p => p.Name == id) 
         .SingleOrDefault(); 
     } 

     if (product == null) 
     { 
      return RedirectToAction("Error"); 
     } 
     ... 
    } 
} 

,我會做的原因是,爲了知道學以致用控制器/動作,該框架是要尋找一個是在所經過的路由數據的簽名相匹配。如果你不沒有匹配的簽名 - 在這種情況下,需要一個字符串 - 在調用任何過濾器之前,您會得到一個異常。不幸的是,我不認爲你可以有一個接受一個字符串,另一個接受一個int - 在這種情況下,如果傳遞一個參數,框架將無法分辨哪一個應該匹配,至少如果它是一個數字,也就是說。通過將其設置爲字符串參數並自己處理翻譯,您可以讓框架完成工作,並獲得所需的行爲 - 無需過濾器。

+1

內這樣做的重定向,我可以有兩個擊潰類似如下: this._Routes.MapRoute(「TypeInt」 ,「type/view/{id}」,new {controller =「Type」,action =「ViewInt」},new {page = @「^ \ d + $」}); this._Routes.MapRoute(「TypeString」,「type/view/{id}」,new {controller =「Type」,action =「ViewString」}); 這樣做會值得嗎?或者你認爲只是嘗試解析? – 2009-06-30 02:50:25

0

不確定你能做到這一點。我認爲你需要傳入一個字符串,然後檢查它是否是數字,但可能有更好的方法。

至於重定向使用

return RedirectToAction("MyProfile", "Profile"); 

您可以傳遞路線值作爲RedirectToAction調用的一部分,所以你可以在ID或名字等傳遞,如果這是真實需要什麼。

還有其他的像重定向到路線,這也可能有助於你想要的。

+0

隨着我在想約找出路爲框架做的工作思維的actionfilter – 2009-06-30 02:51:20

相關問題