ASP.NET MVC如何设置路由启动

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ASP.NET MVC如何设置路由启动相关的知识,希望对你有一定的参考价值。

怎么设置DeBug的时候直接启动页面

我不是很清楚LZ你问的是 设置路由启动 还是 设置直接启动页面;

我这里的MVC版本是VS2010的mvc2,其他的版本我不是很清楚,但是我觉得应该也差不多;
1.在vs2010lz你新建了一个MVC项目后,你会在项目中发现一个Global文件,这个就是决定你所有页面如何访问的关键文件,传统的asp项目是通过访问页面,可以说是访问文件的方式,你可以看到所有的网址后面都是.aspx,但是在mvc中完全不一样了,mvc封装了这种访问,那么lz你只要在这个文件配置就好了;
2.在这个文件下有两个方法
public static void RegisterRoutes(RouteCollection routes)

routes.IgnoreRoute("resource.axd/*pathInfo");

routes.MapRoute(null, // Route name
"控制器名/action结果界面/参数", // URL with parameters
new controller = "Home", action = "index", 参数 = "" );// Parameter defaults
// 第一个路由

routes.MapRoute(null, // 路由名称
"Home/Close/message", // 带有参数的 URL
new controller = "Home", action = "Close", message = "" ); // 参数默认值
routes.MapRoute(
"Default", // 路由名称
"controller/action/id", // 带有参数的 URL
new controller = "Home", action = "Index", id = UrlParameter.Optional // 参数默认值
);


这个方法就是你的路由配置,根据你的项目中有哪些action(带参数的,就是你传过去的值),我这里给出了几种不同的配置,lz你可以试试,就应该知道了;
3.路由的启动,就是这个文件的另外的方法
protected void Application_Start()

AreaRegistration.RegisterAllAreas();
........
RegisterRoutes(RouteTable.Routes);//路由启动

RegisterRoutes这个就会告诉MVC应用程序,路由注册,每次产生访问请求后,MVC就会在这个方法(就是方法2中的那个方法),寻找你配置的路由,产生返回结果;

4.知道上面的基本知识后,那个路由启动就知道了,当MVC启动后他会找到你路由配置的第一个配置, public static void RegisterRoutes(RouteCollection routes)就是这个方法中LZ写的第一个
routes.MapRoute,一般的MVC是new controller = "Home", action = "Index", id = UrlParameter.Optional // 参数默认值 这样翻译过来,就是说第一个路由是view下面的Home文件夹,下面的index页面;

lz你还有不懂的话,直接hi上留言;
------原创回答 by 灰小盒
参考技术A 楼主可以在global里做如下设置
public class MvcApplication : System.Web.HttpApplication

public static void RegisterRoutes(RouteCollection routes)

routes.IgnoreRoute(".axd/");
routes.MapRoute(
"xiaohong", // Route name
"Home/xiaohong", // URL with parameters
new // Parameter defaults
);

routes.MapRoute(
"chenghong", // Route name
"Home/chenghong", // URL with parameters
new // Parameter defaults
);

routes.MapRoute( //注意Default一定要写到最后
"Default", // Route name
"//", // URL with parameters
new // Parameter defaults
);



protected void Application_Start()


AreaRegistration.RegisterAllAreas();

RegisterRoutes(RouteTable.Routes);


另外,虚机团上产品团购,超级便宜本回答被提问者采纳
参考技术B 右键你的mvcwebsite项目属性
找到WEB一项
选择启动URL,输入你要启动的URL就行了,比如/Home/Index

或者

找你的项目配置文件如MvcWebSite.csproj.user
去找 <WebProjectProperties>节点下的
<StartPageUrl>节点

里面改成你想启动的路径就行了如
<StartPageUrl>/Home/Index</StartPageUrl>

asp.net core 系列 5 MVC框架路由(上)

一. 概述

  介绍asp.net core路由时,我初步想了下,分几篇来说明。  路由的知识点很多,参考了官方文档提取出一些重要的知识点来说。    在ASP.NET Core中是使用路由中间件来匹配传入请求的 URL 并将它们映射到操作(action方法)。路由是在程序启动时进行传统路由或属性路由定义。 路由描述如何将 URL 路径与操作相匹配。 它还用于在响应中生成送出的 URL(用于链接)。

  路由操作既支持传统路由,也支持属性路由。也可混合使用。通常传统路由用于为浏览器处理 HTML 页面的控制器。属性路由用于处理 web API 的控制器。

 

  1.1设置路由中间件

    要使用传统路由,必须在UseMVC中间件中配置实现IRouteBuilder接口,在asp.net core mvc 2.2 框架下,应用程序Startup的Configure 方法中,默认路由设置如下:

技术图片
  app.UseMvc(routes =>
            
                routes.MapRoute(
                    name: "default",
                    template: "controller=Home/action=Index/id?");
            );
技术图片

    在对 UseMvc调用中,MapRoute 用于创建单个路由,亦称 default 路由。 大多数 MVC 应用使用带有模板的路由。对于default路由简便的方法可以使用:

  app.UseMvcWithDefaultRoute();

    UseMvc 和 UseMvcWithDefaultRoute 可向中间件管道添加 RouterMiddleware 的实例。 MVC 不直接与中间件交互,而是使用路由来处理请求。 MVC 通过 MvcRouteHandler 实例连接到路由。

    UseMvc 不直接定义任何路由,它向属性路由的路由集合添加占位符controller=Home/action=Index/id? 。通过重载 UseMvc(Action<IRouteBuilder>) 则允许用户添加自己的路由,并且还支持属性路由。

 

  1.2 传统路由

    传统路由是:具有描述性的路由方案,这样URL具有可读性。传统路由格式:controller=Home/action=Index/id?这样的url路径是设定了一个约定: 第一段映射到控制器名称, 第二段映射到操作名称,第二段映射到可选ID。

 

    (1) 使用默认路由:  

    routes.MapRoute("default", "controller=Home/action=Index/id?");

      使用此默认路由时: url路径/Products/List 将映射到程序ProductsController(控制器).List(action)中。 url路径/Blog/Article/17将映射到程序BlogController(控制器).Article(action)中。

 

    (2) 多个路由:

      通过添加对 MapRoute 的多次调用,可以在 UseMvc 内添加多个路由。 这样做可以定义多个约定,或添加专用于特定操作的传统路由,比如:

技术图片
  app.UseMvc(routes =>
    
     routes.MapRoute("blog", "blog/*article",
            defaults: new  controller = "Blog", action = "Article" );
     routes.MapRoute("default", "controller=Home/action=Index/id?");
   );
技术图片

      这里的blog路由是一个专用的传统路由,这表示blog使用传统路由系统,但专用于特定的操作,也就是对于BlogController控制器的Article操作,此专用路由将始终映射。对于多个路由的路由集合会进行排序,并按添加顺序进行处理,因此,在此示例中,将先尝试 blog 路由,再尝试 default 路由。

 

    (3)  action操作的区分

       在处理url请求时,当通过路由匹配到一个控制器内两项相同的action名称时,mvc必须进行区分,以选择最佳候选项,否则会引发异常(AmbiguousActionException)。

技术图片
    public class ProductsController : Controller
     
       public IActionResult Edit(int id)  ... 

       [HttpPost]
       public IActionResult Edit(int id, Product product)  ... 
     
技术图片

      此Products控制器定义了二项操作,这两项操作均与 URL 路径的 /Products/Edit/17 匹配相同。解决方案是将要提交的action加上 Http 谓词为 POST。这样post过来时,就会选择Edit(int, Product)

 

  1.3 属性路由

    通过在控制器(Controller)或操作(Action)上放置路由可实现属性路由。 不能通过传统路由访问定义属性路由的操作,反之亦然。 控制器上的任何路由属性,都会使控制器中的所有操作使用属性路由。

    属性路由使用一组属性将action直接映射到路由模板。在下面的示例中,Configure 方法使用 app.UseMvc();,不传递任何路由。 HomeController 将匹配一组 URL,这组 URL 与默认路由 controller=Home/action=Index/id? 匹配的 URL 类似:

    当去掉default默认路由模板后,只使用app.UseMvc()时。运行程序时,页面报404错误:找不到 localhost 的网页。

    app.UseMvc();

    

    (1) 属性路由基本使用   

    如果定义了属性路由的操作,此时就是启动属性路由功能。Home控制器的属性路由示例如下:

技术图片
    public class HomeController : Controller
    
       [Route("")]
       [Route("Home")]
       [Route("Home/Index")]
       public IActionResult Index()
       
          return View();
       
    
技术图片

    在index的action上加[Route("")]属性路由。 浏览器可以使用下面三种url来访问,也是程序启动时的默认加载页面:

      http://localhost:30081/

      http://localhost:30081/Home/

      http://localhost:30081/Home/index

 

    (2) 属性路由精确控制

      属性路由需要更多输入来指定路由;传统的默认路由处理路由的方式则更简洁。 但是,属性路由允许(并需要)精确控制应用于每项操作的路由模板。下面示例是精确控制每项操作的路由模板,比如url访问/home/index时,即是调用MyIndex的action方法。

技术图片
    public class MyDemoController : Controller
    
       [Route("")]
       [Route("Home")]
       [Route("Home/Index")]
       public IActionResult MyIndex()
       
          return View("Index");
       
    
技术图片

    

  1.4 使用 Http[Verb] 属性的属性路由

    属性路由还可以使用 Http[Verb] 属性,比如 HttpPostAttribute 所有这些属性都可采用路由模板。 此示例展示,同一路由模板匹配的两项操作:

技术图片
     [HttpGet("/products")]
    public IActionResult ListProducts()
    
       // ...
    

    [HttpPost("/products")]
    public IActionResult CreateProduct(...)
    
       // ...
    
技术图片

    当 Http 谓词为 GET 时将执行ProductsApi.ListProducts 操作, 当 Http 谓词为 POST 时将执行 ProductsApi.CreateProduct。生成 REST API 时,很少会在操作方法上使用 [Route(...)]。 建议使用更特定的 Http*Verb*Attributes 来明确 API 所支持的操作。 REST API 的客户端需要知道映射到特定逻辑操作的路径和 Http 谓词。

    例如下面一个web api访问路由,使用Http*Verb*Attributes 来明确定义如下:

    public class ProductsApiController : Controller
    
       [HttpGet("/products/id", Name = "Products_List")]
       public IActionResult GetProduct(int id)  ... 
    

    上面定义只有针对如访问url如: /products/3(而非 /products)之类的 URL才会执行 ProductsApi.GetProduct(int) 操作。

 

   1.5 路由合并

    若要使属性路由减少重复,可将控制器Controller上的路由属性与各个操作Action上的路由属性合并。 控制器上定义的所有路由模板均作为操作上路由模板的前缀。 在控制器上放置路由属性会使控制器中的所有操作都使用属性路由。

    下面是一个web api的路由合并,访问Get的方法的访问路径为: http://localhost:30081/api/Products/1

技术图片
  [Route("api/Products")]
    public class ProductsApiController : Controller
    
        // GET api/values/5
        [HttpGet("id")]
        public string Get(int id)
        
            return "value";
        
    
技术图片

    下面是一个控制器的路由合并。访问index页面的访问路径为: http://localhost:30081/home/index

技术图片
   [Route("Home")]
  public class HomeController : Controller
  
    [Route("")]      // Combines to define the route template "Home"
    [Route("Index")] // Combines to define the route template "Home/Index"
    [Route("/")]     // Doesn‘t combine, defines the route template ""
    public IActionResult Index()
    
      //...
    
  
技术图片

 

  1.6 指定属性路由参数约束
        [HttpGet("Home/id:int",Name = "Pri")]
        public IActionResult Privacy(int id)
        
            return View();
        

    如果输入非整数类型的参数,浏览器提示:找不到与以下网址对应的网页:http://localhost:30081/home/dd

 

   1.7 自定义路由属性

    该框架中提供的所有路由属性([Route(...)]、[HttpGet(...)] 等)都可实现 IRouteTemplateProvider接口。 当应用启动时,MVC 会查找控制器类和操作方法上的属性,并使用可实现 IRouteTemplateProvider的属性生成一组初始路由。

    下面使用IRouteTemplateProvider 来定义自己的路由属性。每个 IRouteTemplateProvider 都允许定义一个包含自定义路由模板、顺序和名称的路由:

技术图片
   public class MyApiControllerAttribute : Attribute, IRouteTemplateProvider
    
        //实现接口的三个属性,这里的[controller]是一个标记替换。
        public string Template => "api/[controller]/action/id?";

        public int? Order  get; set; 

        public string Name  get; set; 
        

    public class ProductsApiController : Controller
    
        // GET api/values/5
        //  [HttpGet("id")]
        [MyApiController()]
        public string Get(int id)
        
            return "value";
        
    
技术图片

    通过访问url: http://localhost:30081/api/ProductsApi/get/1 来调用get方法。

   

  参考文献

  官方资料:asp.net core routing

以上是关于ASP.NET MVC如何设置路由启动的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET CORE 5.0 MVC 中将登录设置为默认路由

asp.net MVC如何设置路由器

asp.net mvc 设置启动页面在区域中

表单身份验证、ASP.NET MVC 和 WCF RESTful 服务

MVC Contrib 是不是兑现了提高 ASP.NET MVC 生产力的承诺

win7+iis7.5+asp.net下 CS0016: 未能写入输出文件“c:WindowsMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NE