asp.net mvc帮助路由

时间:2010-01-20 15:55:07

标签: asp.net-mvc

我有一个包含新闻文章的数据表。

我已经创建了标准的CRUD视图/表单,它也有分页。

例如,此刻我的网址是这样的:

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

可以存档新闻文章(数据库中的布尔值)

我希望网址只映射到数据库或非存档数据中的存档数据。

例如/ 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" }
           );

3 个答案:

答案 0 :(得分:1)

首先,我建议删掉“/ Page”。这不是必需的。您可以默认使用第一页,并自动将“1”传递给“Archived(int page)”和“NonArchived(int page)”方法。此外,如果你想在你的网址中使用“/ Page /”这个词,你将不得不复制下面的地图:一个在网址中没有“/ Page”的集合(如下所示),另一个集合在“/ Page”中”。

注意,MapRoute按顺序工作。如果你想要/ 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 }
);

如果使用'/ news / archive /',页面将等于1.如果使用'/ news / archive / 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)
  {
    ...
  }
}

如果使用默认的Index()路由,您实际上可以跳过上面的第二个maproute。问题是您必须将操作方法​​签名从“页面”更改为“id” - 它将起作用。我没有使用mvc框架中的任何假设,只是为了提高透明度而更加冗长。

答案 1 :(得分: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}” 但这取决于你拥有的其他路线。

答案 2 :(得分: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 bool进行过滤。此外,我同意其他人的观点,即URL中的 Page 文本是多余的。如果您决定将其删除,您可以将其从上面的路线中拉出来,一切都应该仍然有效。祝你好运!