Saturday, July 15, 2017

Part 38 - Attribute routing in asp.net MVC



In this video you will find the basic concept of an Attribute routing. We have included several example of attribute routing which will help you to understand from the depth.

What is attribute routing ?
- MVC-5 has included a new type of routing, which is known as attribute routing. 
- Attribute routing uses attributes to define routes. 
- Attribute routing gives you more control over the URI' s in your web application.
   
Example -

[Route("Student/{Id}")]
 public int GetStudent(int Id)
 {
       return Id;
 }
  
How to enable attribute routing?
-  Open your RouteConfig.cs which is present under App_Start folder. Then you have to  add MapMvcAttributeRoutes()” method into this . Please refer below screenshot.  



Can we use attribute routing with convention-based routing ?
  -    Yes, we can use both of them.

#Various example of attribute routing 

1. Optional parameter and default value:
We can set parameter as optional and can set default value for this. To set optional parameter we  used "?" character in [Route]. Example: [Route("Student/Name/{Name?}")].
we can also set the default value for this. Example: [Route("Student/Name/{Name=Ashish}")].
Now below method can be accessed by below url pattern
1. Student/Name/YourName" 
2.  Student/Name"

    //Optional URI parameter
  [Route("Student/Name/{Name?}")]
  public string GetStudent(string Name)
  {
      return "Student with Name =" + Name;
   }

   //Default URI parameter value
   [Route("Student/Name/{Name=Ashish}")]
  public string GetStudent(string Name)
  {
    return "Student with Name =" + Name;
   }

2.  Route Prefixes: 
 -   You can use route prefix at method level as well as at controller level. 
    
a). Route prefix at method level 
 In [Route("Student")] and [Route("Student/{Id}")], the Student text is acting like route prefix 


 [Route("Student")]
 public string GetStudent()
 {
    return "All";
 }

 [Route("Student/{Id}")]
 public string GetStudent(int Id)
 {
    return "Student with Id=" + Id;
 }

b). Route prefix at controller level 
Route prefix can be added at controller level. Here we have added  [RoutePrefix("Home")]
on the top of TestController class. Now we can access the Index method with below url pattern. 
 Home/Index
namespace MVCTutorial.Controllers
{
    [RoutePrefix("Home")]   
    public class TestController : Controller
    {

        public ActionResult Index()
        {
            return View();
        }

     
    }
}

3.  Default Route :
We can set the default route at controller level. Example  [Route("{action=Index}")]

namespace MVCTutorial.Controllers
{
    [RoutePrefix("Home")]
    [Route("{action=Index}")]
    public class TestController : Controller
    {

        public ActionResult Index()
        {
            return View();
        }

     
    }
}

5.  Route Constraints
Route constraints let you restrict how the parameters in the route template are matched. The general syntax is {parameter:constraint}. For example, in the below code, there are three "GetStudent()" methods. Now see below cases in which we have shown that which url pattern will be used to call "GetStudent()" method.

case (a). Test/Student/11  - It will call first GetStudent() method as we passed an integer value as an optional parameter i.e. "11" . Also "11" does not lie between 3 and 10. So, there is no chance for calling third GetStudent() method. So,  this route will work :  [Route("Student/{Id:int}")]
case (b). Test/Student/Ashish - It will call the second method as we have passed a string value as an optional parameter. i.e "Ashish". In this case [Route("Student/{Name}")] will be working.
case (c). Test/Student/4  - It will call the third GetStudent() method as we have passed an integer as an optional parameter and its also lies  between 3 to 10. So, this route will be working in this case : [Route("Student/{Id:int:min(3):max(10)}")] 

namespace MVCTutorial.Controllers
{
      
    public class TestController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
        [Route("Student/{Id:int}")]    //case (a)
        public string GetStudent(int Id)
        {
            return "Student with Id=" + Id;
        }

        [Route("Student/{Name}")]     // case (b)
        public string GetStudent(string Name)
        {
            return "Student with Name=" + Name;
        }

        [Route("Student/{Id:int:min(3):max(10)}")]  // case (c)
        public string GetStudent(int Id)
        {
            return "Student with Id=" + Id;
        }


        [Route("Student/Message/{Message:maxlength(5)}")]
        public string GetMessage(string Message)
        {
            return "Student message=" + Message;
        }

    }

}

Below constraint chart will help you to apply constraint against different URL

 SN
 Constraint
 Description
 Example
ü1
alpha
Matches uppercase or lowercase Latin alphabet characters (a-z, A-Z)
{x:alpha}
ü2
bool
Matches a Boolean value.
{x:bool}
ü3
datetime
Matches a DateTime value.
{x:datetime}
ü4
decimal
Matches a decimal value.
{x:decimal}
ü5
double
Matches a 64-bit floating-point value.
{x:double}
ü6
float
Matches a 32-bit floating-point value.
{x:float}
ü7
guid
Matches a GUID value.
{x:guid}
ü8
int
Matches a 32-bit integer value.
{x:int}
ü9
length
Matches a string with the specified length or within a specified range of lengths.
{x:length(6)} {x:length(1,20)}
ü10
long
Matches a 64-bit integer value.
{x:long}
ü11
max
Matches an integer with a maximum value.
{x:max(10)}
ü12
maxlength
Matches a string with a maximum length.
{x:maxlength(10)}
ü13
min
Matches an integer with a minimum value.
{x:min(10)}
ü14
minlength
Matches a string with a minimum length.
{x:minlength(10)}
ü15
range
Matches an integer within a range of values.
{x:range(10,50)}
ü16
regex
Matches a regular expression.
{x:regex(^\d{3}-\d{3}-\d{4}$)}



All Code Factory


No comments: