views:

205

answers:

2

I have this set of routes:

        routes.MapRoute(
            "IssueType",
            "issue/{type}",
            new { controller = "Issue", action = "Index" }
        );

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

Here is the controller class:

public class IssueController : Controller
{
    public ActionResult Index()
    {
        // todo: redirect to concrete type
        return View();
    }

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

why, when i request http://host/issue i get The current request for action 'Index' on controller type 'IssueController' is ambiguous between the following action methods:
I expect that first one method should act when there is no parameters, and second one when some parameter specified.

where did i made mistake?

UPD: possible duplicate: http://stackoverflow.com/questions/436866/can-you-overload-controller-methods-in-asp-net-mvc

UPD 2: due to the link above - there is no any legal way to make action overloading, is it?

UPD 3: Action methods cannot be overloaded based on parameters (c) http://msdn.microsoft.com/en-us/library/system.web.mvc.controller%28VS.100%29.aspx

A: 

I would have one Index method that looks for a valid type variable

    public class IssueController : Controller  
{  
    public ActionResult Index(string type)  
    {  
        if(string.isNullOrEmpty(type)){
            return View("viewWithOutType");}
        else{
            return View("viewWithType");} 
    }
}

EDIT:

How about creating a custom attribute that looks for a specific request value as in this post StackOverflow

[RequireRequestValue("someInt")] 
public ActionResult MyMethod(int someInt) { /* ... */ } 

[RequireRequestValue("someString")] 
public ActionResult MyMethod(string someString) { /* ... */ } 

public class RequireRequestValueAttribute : ActionMethodSelectorAttribute { 
    public RequireRequestValueAttribute(string valueName) { 
        ValueName = valueName; 
    } 
    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) { 
        return (controllerContext.HttpContext.Request[ValueName] != null); 
    } 
    public string ValueName { get; private set; } 
} 
Tommy
yep, it's obvious but not actually solution for the issue
zerkms
yep, this bring some kind of overloading but too dirty, so i choose to simply rename second method. thanks
zerkms
A: 

You can do it using an ActionFilterAttribute that checks the parameters using reflection (I tried it) but it's a bad idea. Each distinct action should have its own name.

Why not just call your two methods "Index" and "Single", say, and live with the limitation on naming?

Unlike methods that are bound at compile time based on matching signatures, a missing route value at the end is treated like a null.

If you want the [hack] ActionFilterAttribute that matches parameters let me know and I'll post a link to it, but like I said, it's a bad idea.

Hightechrider
I already rename second so i have 2 methods. And i get a lot of links to ActionFilterAttribute, indeed - it's a worse solution. thank you anyway.
zerkms