2016年7月27日 星期三

[ASP.NET Core] Set Routing

 ASP.NET Core    MVC 6    Web Api    Route  


▌Introduction


In this article, we will know how to
l   Set an Areas routing rule (template)
l   Use Route attribute in MVC
l   Use Route attribute in WebApi




▌Environment

l   Visual Studio 2015 Update 3
l   Visual Studio 2015 DotNetCore tools – preview 2
l   DotNetCore 1.0.0 Runtime




Implement


Set an Areas routing rule (template)

We can find the default route template in Startup.cs : Configure
Add the following red codes to support Area routing ruls.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    //…Skip
   
app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name:"areaRoute",
                    template:"{area:exists}/{controller=Home}/{action=Index}/{id?}");

                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
}


Enable Areas routing in MVC:Controller

Now create Areas, for example,



To enable Areas routing, use [Area] and [Route] attributes like this,

[Area("User")]
[Route("User/[controller]")]
public class AuthController : Controller
{
       [Route("[action]")]
        public IActionResult Index()
        {
            _logger.Debug($"Areas:User,Controller:Auth,Action:Index");
            ViewBag.Title = "Index";

            return View();
        }

        [Route("[action]")]
        public IActionResult Create()
        {
            _logger.Debug($"Areas:User,Controller:Auth,Action:Create");
            ViewBag.Title = "Create";

            return View();
        }

        //[Route("[action]/{page}")] //It's ok to write like this
        [Route("[action]/{page:int?}")]
        public IActionResult Edit(int? page)
        {
            _logger.Debug($"Areas:User,Controller:Auth,Action:Edit, and page is {page}");
            ViewBag.Title = "Edit";
            ViewBag.Page = page;

            return View();
        }

        [Route("[action]/{data}")]
        public IActionResult Edit(String data)
        {
            _logger.Debug($"Areas:User,Controller:Auth,Action:Edit, and data is {data}");
            ViewBag.Title = "Edit";
            ViewBag.Page = data;

            return View();
        }

}

Note :
Use [Route("[action]/{page:int?}")] to add a int? URI parameter for following usage:

and  [Route("[action]/{data}")] to add a string type URI parameter.


Enable Areas routing in WebApi:Controller

There is no need to add routing template in WebApi Startup.cs
Just put [Route] attribute to assign the routing rules for WebApi’s controllers and actions (Restful methods).




[Route("api/User/[controller]")]
public class AuthController : Controller
{
        [HttpGet("GetAll")]
        public IEnumerable<string> Get()
        {
            return new string[] { "auth1", "auth2" };
        }

        [HttpGet("Get/{id}")]
        public string Get(int id)
        {
            return id.ToString();
        }

        // POST api/values
        [HttpPost]
        public void Post(DtoModel model)
        {
        }

        // DELETE api/values/5
        [HttpDelete("Delete/{id}")]
        public void Delete(int id)
        {
        }
    }

Note that you can add an action name in Http Method attribute like the following to define the action name for the action

[HttpGet("GetAll")]
public IEnumerable<string> Get()

And the HttpGet url will be
http://localhost:14125/api/user/auth/getall

Results in Postman:



































Reference


沒有留言:

張貼留言