Routing to the actions with same names but different parameters

后端 未结 4 1424
无人共我
无人共我 2021-01-01 11:40

I have this set of routes:

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


        
相关标签:
4条回答
  • 2021-01-01 12:03

    All you have to do is mark your second Action with [HttpPost]. For instance:

    public class IssueController : Controller
    {
        public ActionResult Index()
        {
            // todo: redirect to concrete type
            return View();
        }
    
        [HttpPost]
        public ActionResult Index(string type)
        {
            return View();
        }
    }
    
    0 讨论(0)
  • 2021-01-01 12:05

    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; } 
    } 
    
    0 讨论(0)
  • 2021-01-01 12:07

    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.

    0 讨论(0)
  • 2021-01-01 12:26

    I ran into a similar situation where I wanted my "Index" action to handle the rendering if I had an ID specified or not. The solution I came upon was to make the ID parameter to the Index method optional. For example, I originally tried having both:

    public ViewResult Index()
    {
        //...
    }
    // AND
    public ViewResult Index(int entryId)
    {
        //...
    }
    

    and I just combined them and changed it to:

    public ViewResult Index(int entryId = 0)
    {
        //...
    }
    
    0 讨论(0)
提交回复
热议问题