4

我有这个控制器:

public class ProfileController : Controller
{
    public ActionResult Index( long? userkey )
    {
        ...
    }

    public ActionResult Index( string username )
    {
        ...
    }
}

我如何为这个动作定义 MapRoute 的工作方式如下:

mysite.com/Profile/8293378324043043840

这必须首先采取行动

mysite.com/Profile/MyUserName

这必须进行第二次行动

我有第一个行动的路线

routes.MapRoute( name: "Profile" , url: "Profile/{userkey}" , defaults: new { controller = "Profile" , action = "Index" } );

我需要添加另一个 MapRoute 吗?或者我可以为这两个动作更改当前的 MapRoute 吗?

4

1 回答 1

5

首先,如果您使用相同的 Http Verb(在您的情况下为 GET),则不能重载控制器操作,因为您需要具有唯一的操作名称。

因此,您需要以不同的方式命名您的操作:

public class ProfileController : Controller
{
    public ActionResult IndexKey( long? userkey )
    {
        ...
    }

    public ActionResult IndexName( string username )
    {
        ...
    }
}

或者您可以使用ActionNameAttribute为您的操作指定不同的名称:

public class ProfileController : Controller
{
    [ActionName("IndexKey")]
    public ActionResult Index( long? userkey )
    {
        ...
    }

    [ActionName("IndexName")]
    public ActionResult Index( string username )
    {
        ...
    }
}

然后,您将需要两条路线,并在 上使用路线约束userkey作为数值来设置您的操作:

routes.MapRoute(name: "Profile", url: "Profile/{userkey}",
                defaults: new { controller = "Profile", action = "IndexKey" },
                constraints: new { userkey = @"\d*"});

routes.MapRoute(name: "ProfileName", url: "Profile/{userName}",
                defaults: new {controller = "Profile", action = "IndexName"});
于 2012-12-27T13:27:10.003 回答