Asp.net mvc 路由到名称相同但参数不同的操作

Asp.net mvc 路由到名称相同但参数不同的操作,asp.net-mvc,routing,Asp.net Mvc,Routing,我有一套路线: routes.MapRoute( "IssueType", "issue/{type}", new { controller = "Issue", action = "Index" } ); routes.MapRoute( "Default", // Route name "{controller}/{acti

我有一套路线:

        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
        );
以下是控制器类:

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

    public ActionResult Index(string type)
    {
        return View();
    }
}
为什么,当我请求获取控制器类型“IssueController”上的当前操作请求“Index”时,以下操作方法之间不明确:
我希望第一个方法应该在没有参数时起作用,第二个方法应该在指定某个参数时起作用

我哪里出错了

UPD:可能重复:

UPD 2:由于上面的链接,没有任何合法的方法使操作过载,是吗


upd3:不能基于参数(c)重载操作方法

我将有一个索引方法来查找有效的类型变量

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

如何创建一个自定义属性来查找特定的请求值,如本文所述


您可以使用ActionFilterAttribute来完成,该属性使用反射检查参数(我尝试过),但这不是一个好主意。每个不同的操作都应该有自己的名称

为什么不把这两种方法称为“Index”和“Single”,并限制命名呢

与编译时基于匹配签名绑定的方法不同,末尾缺少的路由值被视为null


如果您想要与参数匹配的[hack]ActionFilterAttribute,请告诉我,我将发布一个指向它的链接,但正如我所说的,这不是一个好主意。

您所要做的就是用[HttpPost]标记您的第二个操作。例如:

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

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

我遇到了类似的情况,我希望我的“索引”操作处理渲染,如果我有一个指定的ID或没有。我找到的解决方案是将Index方法的ID参数设置为可选。 例如,我最初尝试同时使用以下两种:

public ViewResult Index()
{
    //...
}
// AND
public ViewResult Index(int entryId)
{
    //...
}
我把它们结合起来,改成:

public ViewResult Index(int entryId = 0)
{
    //...
}

是的,这是显而易见的,但实际上并不是issueyep的解决方案,这带来了某种重载,但太脏了,所以我选择简单地重命名第二个方法。谢谢,我已经重命名了second,所以我有两个方法。我得到了很多ActionFilterAttribute的链接,事实上,这是一个更糟糕的解决方案。无论如何谢谢你。谁告诉你第二个已经发布了?我经常看到这种情况,尤其是对于登录方法——一个获取操作来服务初始视图,一个发布来接受登录请求并重定向。一般来说,我在第一个框架上也看到了
[HttpGet]
标记,不确定哪一个框架版本(如果有)需要它,但标记这两个都可以使推理变得更容易。这可能是.NET 4.0的解决方案,但我当时使用的是3.5;-)
public ViewResult Index(int entryId = 0)
{
    //...
}