Click here to Skip to main content
13,837,307 members
Click here to Skip to main content
Add your own
alternative version

Tagged as


20 bookmarked
Posted 28 Nov 2011
Licenced CPOL

Custom Action Method Selector in MVC

, 28 Nov 2011
Rate this:
Please Sign up or sign in to vote.
Implementing a customized ActionMethodSelector attribute approach to make seemingly complex things trivial.


The default routing algorithm for how the ASP.NET MVC framework invokes actions is like {controller}/ {action}/ {id} patterns.

But this becomes more complex when you have two methods with the same name, or when you invoke an action when form data is submitted, or execute a method only when an AJAX request is made.



This can be done using ActionMethodSelector attributes. We generally use method selectors like:

  1. AcceptVerbs
  2. ActionName


This attribute is used when we want to execute some action when a particular HTTP operation is performed like POST, GET, DELETE, etc. E.g.:

public ActionResult Create(Employee employee)
      // To Do Code Here

The above method is executed when an HTTP POST operation is performed.


This attribute is used when you expose an action name with a different name than its method name, or you can use an action name attribute to expose two methods with the same name as the action with different names. E.g.:

public ActionResult Edit_GET(Employee  employee)
    // To Do Code Here
Public ActionResult Edit_POST(Employee employee)
    // To Do Code Here

Custom Action Method Selector

You can build your own ActionMethodSelector attributes by deriving from the abstract ActionMethodSelectorAttribute class.

This is an extremely simple class; you just need to override the method named IsValidForRequest (). If this returns false, this action method is not executed.

Now take a simple example of the Custom Action Method Selector. Develop an Ajaxmethod custom attribute useful for when you want to execute some action when an AJAX request is made.

The first step is to create an MVC application. Then add a class file named AjaxMethod.cs and inherit that class from ActionMethodSelectorAttribute. Then override a method named IsValidForRequest(). Your class will look like below:

public class AjaxMethod:ActionMethodSelectorAttribute
   public override bool IsValidForRequest(ControllerContext controllerContext, 
          System.Reflection.MethodInfo methodInfo)
       return controllerContext.HttpContext.Request.IsAjaxRequest();

In the IsValidForReuest method, we check the Request object for the AJAX request.

Now we can use the Ajaxmethod attribute in our controller when you want to execute some action only when an AJAX request comes. For this, add a controller named NewsController into the controller folder. In this controller, we define two index actions: first index action only executes when a page is posted back and the second action is invoked when an AJAX request comes. Your controller will look like below:

public class NewsController : Controller

    private readonly List<string> _news = new List<string>();
    private Random _rnd = new Random();

    public NewsController()
        _news.Add("Moon Explodes");
        _news.Add("Stock Market up 200 percent");
        _news.Add("Talking Robort Created!");
    // GET: /News/

    public ActionResult Index()
        var SelectedIndex = _rnd.Next(_news.Count);
        ViewData["News"] = _news[SelectedIndex];
        return View();

    public string Index_AJAX()
        var SelectedIndex = _rnd.Next(_news.Count);
        return _news[SelectedIndex];

Now add a View named index.aspx for displaying news and add the below markup into that:

<script type="text/javascript" src="../../Scripts/MicrosoftAjax.js"></script>
    <script type="text/javascript" src="../../Scripts/MicrosoftMvcAjax.js"></script>
      <%= Ajax.ActionLink("Get News", "Index", new AjaxOptions { UpdateTargetId = "news" })%>
      <span id="news"%><%:ViewData["News"] %></span>

Now run the application. You will find that when the page loads the first time the first index action executes and when you click on the GetNews link at that time, the second index action executes. The first time, it will go check the Ajaxmethod attribute but the IsValidForRequest method will return false and then it will execute the first index action, but when you click on the link at that time, IsValidForRequest returns true and executes the second action.


Some of the least customized but very useful extension points in ASP.NET MVC are action method selector attributes. But using them, we can make seemingly complex things trivial.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Jigar Bagadai
Software Developer
India India
I have been working as a Software Engineer on Microsoft .NET Technology.I have developed several web/desktop application build on .NET technology .My point of interest is Web Development,Desktop Development,Ajax,Json,Jquey,XML etc.I have completed Master of Computer Application in May-2011.I'm not happy unless I'm learning something new.

You may also be interested in...


Comments and Discussions

BugActionName is just alias of method Pin
Afazal MD 310420931-Oct-13 0:09
professionalAfazal MD 310420931-Oct-13 0:09 
SuggestionTypo Error Pin
prawinkumarpauldavid30-Jan-13 17:16
memberprawinkumarpauldavid30-Jan-13 17:16 
GeneralMy vote of 5 Pin
Manoj Kumar Choubey7-Jul-12 3:07
professionalManoj Kumar Choubey7-Jul-12 3:07 
QuestionVery well explained Pin
Dinesh Mani28-Nov-11 23:29
memberDinesh Mani28-Nov-11 23:29 
AnswerRe: Very well explained Pin
Jigar Bagadai29-Nov-11 0:10
memberJigar Bagadai29-Nov-11 0:10 
SuggestionA shorthand way to determine the accepted verb. Pin
stapia.gutierrez28-Nov-11 18:39
memberstapia.gutierrez28-Nov-11 18:39 
GeneralRe: A shorthand way to determine the accepted verb. Pin
Jigar Bagadai29-Nov-11 6:46
memberJigar Bagadai29-Nov-11 6:46 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Cookies | Terms of Use | Mobile
Web04 | 2.8.190114.1 | Last Updated 28 Nov 2011
Article Copyright 2011 by Jigar Bagadai
Everything else Copyright © CodeProject, 1999-2019
Layout: fixed | fluid