2012-08-07 47 views
0

我想創建一個在同一時間一個字符串和一個int值列表類似如下:如何在不創建新視圖的情況下使用不同類型的參數?

@Html.ActionLink("Back to List", "IndexEvent", new { location = "location" }) 

@Html.ActionLink("Back to List", "IndexEvent", new { locationID = 1 }) 

它沒有工作。我想MVC控制器沒有得到參數的類型差異。所以,我不得不將一個新的Action作爲「IndexEvenyByID」,但它需要有一個新的視圖。既然我想保持簡單,有什麼方法可以針對不同的參數使用相同的視圖?

回答

1

嘗試增加兩個可選參數,這樣的IndexEvent動作:

public ActionResult IndexEvent(string location = "", int? locationID = null) 
+0

我個人比較喜歡測試一個null int然後一個基於0的int(誰知道,也許你會想用0作爲索引)。這就是說,我只是把(字符串位置,int?locationID) – Pluc 2012-08-07 19:49:47

+0

是的,聽起來像一個更一般的解決方案 – 2012-08-07 19:50:45

+0

必須測試空參數,以確定如何檢索數據相比,有兩個動作,專門檢索數據可能會變得雜亂無章,並帶來一些問題,例如,如果某人在URL中使用了URL並且兩者都不爲空或兩者都會發生什麼情況?有單獨的行動通常是乾淨的方法 – Tommy 2012-08-07 19:53:55

1

這不應該需要一個新的視圖或視圖模型。你應該有兩個動作如你所描述,但代碼可能如下:

控制器

public ActionResult GetEvents(string location){ 
    var model = service.GetEventsByLocation(location); 
    return View("Events", model); 
} 

public ActionResult GetEventsById(int id){ 
    var model = service.GetEventsById(id); 
    return View("Events", model); 
} 

服務

public MyViewModel GetEventsByLocation(string location){ 
    //do stuff to populate a view model of type MyViewModel using a string 
} 

public MyViewModel GetEventsById(int id){ 
    //do stuff to populate a view model of type MyViewModel using an id 
} 

基本上,如果你的觀點是要使用相同的視圖模型,唯一改變的是如何獲取數據,您可以完全重用視圖。

0

如果你確實想堅持一個動作和多種類型,你可以使用一個對象參數。

public ActionResult GetEvents(object location) 
{ 
    int locationID; 
    if(int.TryParse(location, out locationID)) 
     var model = service.GetEventsByID(locationID); 
    else 
     var model = service.GetEventsByLocation(location as string); 
    return View("Events", model); 
} 

類似的東西(不完全正確,但它給你一個想法)。然而,這不會是一個「乾淨」的方式來做IMO。

(編輯)

但2種操作方法仍是目前最好(例如,如果我們能夠解析地點名稱爲INT?會發生什麼)

相關問題