2010-01-20 156 views
0

我有一個包含newsarticles的數據表。asp.net mvc幫助路由

我創建了標準的CRUD視圖/表單,它也有分頁。

例如,在此刻我有網址是這樣的:

// GET: /News/ 
//  /News/Page/2 

新聞文章可以存檔(一個數據庫中的布爾值)

我希望URL映射到唯一的存檔數據數據庫或非存檔數據。

eg/News/Archived/Page/2應映射到僅存檔項目的第2頁。

和/ News/Page/2應映射到未歸檔項目的第2頁。

我需要做什麼在全球asax實現這一點。索引方法的簽名應該是什麼?

//Signature in controller 
public ActionResult Index(int? page) 


//Route for paging 
routes.MapRoute(
       "NewsArticles", 
       "News/Page/{page}", 
       new { controller = "News", action = "Index" } 
      ); 

回答

0

如果您想使用相同的動作控制器上的服務這兩種情況下,我可能會簽名更改爲類似這樣:

public ActionResult Index(bool archive, int? page) 

然後,你可以有這樣兩種不同的路線。首先對於非歸檔的東西:

routes.MapRoute(
    "NewsArticles", 
    "News/Page/{page}", 
    new { controller = "News", action = "Index", archive = false } 
); 

然後存檔版本:

routes.MapRoute(
    "NewsArticlesArchive", 
    "News/Archive/Page/{page}", 
    new { controller = "News", action = "Index", archive = true } 
); 

現在,你必須在你的基礎上,archive布爾過濾的行動自由。另外,我同意其他人的意見,URL中的文本是多餘的。如果你決定刪除它,你可以將它拖出上面的路線,一切都應該仍然有效。祝你好運!

+1

我建議不要使用相同的操作方法來控制兩個不同的數據路徑。這往往會在操作方法中創建更復雜的邏輯,這是針對最佳MVC模式而建議的 - 操作方法應該是邏輯和錯誤不可知的,並且應該只將參數傳遞到域中,並將返回的任何數據傳遞到查看(或返回域中的任何錯誤(如果有的話))。 – eduncan911 2010-01-20 16:17:11

+0

我不同意。控制器負責與模型進行通信並獲得結果。我不明白這是如何違背MVC模式的。操作規範指出,歸檔和非歸檔結果之間唯一的區別因素是數據庫中的單個位字段。我認爲將這一切傳遞給你的模型切換你回來的結果沒有任何壞處。 – 2010-01-20 16:20:00

+0

另外,它不是兩個不同的「數據路徑」,如上所述。在你的解決方案中,OP要麼必須創建兩個Views,要麼將View的名稱傳遞給View()方法,無論哪種情況,他的模型對象對於兩個控制器方法都是相同的。它只是爲了編碼而添加代碼給我... – 2010-01-20 16:22:20

0
//Signature in controller 
public ActionResult Archive(int? page) 


//Route for paging 
routes.MapRoute(
       "NewsArticles", 
       "News/Archive/Page/{page}", 
       new { controller = "News", action = "Archive", page = 1 } 
); 

我可能還簡化了路由,不包括字的頁面即: 「新聞/存檔/ {PAGE}」和「新聞/ {PAGE}」 但是這取決於其他什麼你有路線。

1

首先,我建議擺脫「/頁」。這不是必需的。您可以默認第一頁,並自動將「1」傳遞給「存檔(int page)」和「非存檔(int page)」方法。另外,如果你想在你的url中使用「/ Page /」這個詞,你將不得不復制下面的地圖:一個在URL中沒有「/ Page」的地方(如下所示),另一個地方用「/ Page 」。

注意,MapRoute按順序工作。如果你想要/ Page,那麼在你使用下面的兩個url之前,你必須首先使用這兩條路線(News/Archive/Page/{page}和News/Page)。

routes.MapRoute(
    "ArchivedArticles", 
    "News/Archive/{page}", 
    new { controller = "News", action = "Archived", page = 1 } 
); 

routes.MapRoute(
    "NonArchivedArticles", 
    "News/{page}", 
    new { controller = "News", action = "NonArchived", page = 1 } 
); 

如果「/消息/存檔/」時,頁面會等於1.如果「/消息/存檔/ 2」被使用,那麼頁面將等於2,依此類推。 '/ news'和'/ news/2'相同。

你NewsController將有兩種方法:

public class NewsController : Controller 
{ 
    [AcceptVerbs(HttpVerbs.Get)] 
    public ViewResult NonArchived(Int32 page) 
    { 
    ... 
    } 

    [AcceptVerbs(HttpVerbs.Get)] 
    public ViewResult Archived(Int32 page) 
    { 
    ... 
    } 
} 

其實你可以跳過上面的第2圖路線,如果你使用默認的指數()路線。問題在於你必須將操作方法​​簽名從「頁面」更改爲「ID」 - 並且它會起作用。我只是通過不使用mvc框架中的任何假設而使它更加詳細,以獲得更高的透明度。

+0

在網址中擺脫'Page的建議對我來說很有意義,但如果他所做的只是基於位域返回同一個模型對象的相同視圖,那麼擁有兩個控制器方法確實顯得很愚蠢。爲什麼不合併成一個,並讓控制器採用另一個參數,比如我發佈的解決方案? – 2010-01-20 16:17:44

+0

有趣,我只是回答你的問題,說明爲什麼不使用相同的操作方法。上述兩種操作方法都可以使用相同的格式返回相同的視圖。對他自己我想。大聲笑 – eduncan911 2010-01-20 16:20:54

+0

偉大的思想認爲...相反?哈哈 :) – 2010-01-20 16:23:06