Asp.net mvc asp.net mvc路由帮助

Asp.net mvc asp.net mvc路由帮助,asp.net-mvc,Asp.net Mvc,我有一个包含新闻文章的数据表 我创建了标准的CRUD视图/表单,它也有分页功能 例如,目前我有如下URL: // GET: /News/ // /News/Page/2 public ActionResult Index(bool archive, int? page) 可以存档新闻文章(数据库中的布尔值) 我希望url只映射到数据库中的存档数据或非存档数据 例如/News/Archived/Page/2应该只映射到归档项目的第2页 和/News/Page/2应映射到非归档项目

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

我创建了标准的CRUD视图/表单,它也有分页功能

例如,目前我有如下URL:

// GET: /News/
//      /News/Page/2  
public ActionResult Index(bool archive, int? page)
可以存档新闻文章(数据库中的布尔值)

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

例如/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" }
           );
我可能也会简化路线,不包括单词页面,即: “News/Archive/{page}”和“News/{page}”
但这取决于您有哪些其他路由。

如果您想在控制器上使用相同的操作来服务这两种情况,我可能会将签名更改为如下内容:

// GET: /News/
//      /News/Page/2  
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 }
);

现在,您可以自由地根据
归档文件进行过滤。另外,我同意其他人的观点,URL中的页面文本是多余的。如果你决定移除它,你可以把它从上面的路径中拽出来,一切都应该正常。祝你好运

首先,我建议去掉“/Page”。不需要。您可以默认为第一个页面,并让它自动将“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 }
);
如果使用“/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。问题是,您必须将操作方法签名从“page”更改为“id”-这样就可以了。我只是通过不使用mvc框架中的任何假设来使它更加详细,以提高透明度。

我建议不要使用相同的操作方法来控制两个不同的数据路径。这倾向于在action方法中创建更复杂的逻辑,这是最好的MVC模式所不建议的-action方法应该是逻辑和错误无关的,并且应该将参数向下传递到域中,并将返回的任何数据传递到视图中(或者从域返回任何错误(如果有的话))。我不同意。控制器负责与模型通信并获得结果。我不认为这与MVC模式背道而驰。OP表示,存档和未存档结果之间的唯一区别因素是数据库中的一个位字段。我认为把它传递给你的模型来切换你得到的结果没有什么坏处。而且,它并不是你上面提到的两种不同的“数据路径”。在您的解决方案中,OP必须创建两个视图,或者将视图的名称传递给View()方法,并且在任何一种情况下,他的模型对象对于两个控制器方法都是相同的。这就像是为了给我编码而添加代码……呵呵,是的。伟人认为。。。相反地。我从TDD/BDD着手,在那里我将设计两种方法——对另一种方法一无所知。我也做BDD(感谢上帝为mspec、xunit和Moq)。我可以看到拥有两种方法的价值,特别是在将来这两种代码路径发生分歧时,但简单地向此操作传递bool对我来说是无害的:)在URL中删除
Page
的建议对我来说很有意义,但是,如果他所做的只是基于一个位字段返回具有相同模型对象的相同视图,那么使用两个控制器方法似乎真的很愚蠢。为什么不合并成一个,让控制器采用另一个参数,就像我发布的解决方案一样?有趣的是,我刚刚回答了你的问题,说明为什么不使用相同的操作方法。上述两种操作方法都可以返回相同格式的相同视图。我想每个人都有自己的。英雄联盟