2012-12-27 3 views
4

У меня есть этот контроллер:MapRoute для перегрузки действий

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 для обоих действий?

ответ

6

Сначала вы не можете перегружать действия контроллера, если используете тот же Http-сервер (в вашем случае 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) 
    { 
     ... 
    } 
} 

Далее вам потребуется два маршрута с using route constraints на 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"}); 
+0

можете ли вы добавить образец ** ActionNameAttribute **? – Raika

+0

@Raika Я обновил свой ответ. – nemesv

+0

Другой вопрос: мне нужно создать отдельный файл .cshtml для каждого действия? – Raika

Смежные вопросы