我有一个包含新闻文章的数据表。
我已经创建了标准的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" }
);
答案 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 文本是多余的。如果您决定将其删除,您可以将其从上面的路线中拉出来,一切都应该仍然有效。祝你好运!