Маршруты ASP.NET MVC: конфликт имен действий с пользовательским маршрутом

Я все,

В предыдущем вопросе я спросил, как определить настраиваемый маршрут для обработки следующего URL-адреса:

http://www.example.com/User/Profile/Edit/{userProfileID}

У меня есть объект User и объект UserProfile, но только UserController, который я хочу использовать для действий над обоими объектами. У меня уже есть метод в UserController под названием Edit, который обрабатывает изменения для пользователя. Но мне также нужен метод для редактирования UserProfile. Ответом на мой вопрос о маршрутизации был следующий маршрут:

routes.MapRoute(
    "ProfileleRoute", // Route name
    "User/Profile/{action}/{userProfileID}", // URL with parameters
    new { controller = "User", action = "Index" } // Parameter defaults
);

Но с учетом этого пользовательского маршрута, где я должен объявить действие редактирования для UserProfile и как оно должно называться? Похоже, я не мог написать еще один метод в UserController под названием Edit, потому что у меня уже есть метод, который обрабатывает пользовательские правки.

Поэтому я чувствую, что в конечном итоге мне понадобятся два действия «Редактировать» для обработки следующих маршрутов: «Пользователь/Редактировать» и «Пользователь/Профиль/Редактировать». Как мне обойти это?

Большое спасибо.


person MegaMatt    schedule 02.11.2010    source источник
comment
Вы говорите, что вам нужно различать User/Edit и User/Profile/Edit ?   -  person dotariel    schedule 02.11.2010
comment
Да, именно то, что я говорю. Отредактированный вопрос, чтобы быть более ясным.   -  person MegaMatt    schedule 02.11.2010
comment
Зачем вам нужно его обойти? Разве это не совсем то, что вам нужно? Или они одинаковые?   -  person dotariel    schedule 02.11.2010
comment
Может быть, это ответ на мой вопрос. Могу ли я просто иметь два метода действия в UserController, оба называемые Edit, но принимающие два разных параметра? Мне нужно иметь возможность различать эти два действия, потому что действия совершенно разные в зависимости от того, редактирую ли я пользователя или профиль пользователя.   -  person MegaMatt    schedule 02.11.2010
comment
Лично я бы использовал другой контроллер, так как я вижу в нем 2 совершенно разных действия, поскольку у вас также есть 2 разных объекта. Вы действительно пытаетесь создать второе действие редактирования с другим типом параметра, оно должно рассматриваться вашим приложением как другой метод. Только не уверен, что это сработает, раньше не пробовал ничего подобного, но мне кажется интересной проблемой.   -  person Rob    schedule 02.11.2010
comment
Кажется, я понимаю, о чем вы спрашиваете. Если два маршрута указывают на одно и то же действие, вам нужно перегрузить свое действие. Если сигнатура метода одинакова для обоих случаев, компилятор выдаст ошибку, и вам, возможно, придется создать отдельные действия; т.е. - EditProfile() и EditUser()   -  person dotariel    schedule 02.11.2010
comment
@saint и назвать обе функции Edit(), но с разными параметрами. Во что это должно вылиться?   -  person Rob    schedule 02.11.2010
comment
@Rob - Если бы у вас были Edit (пользователь-пользователь) и Edit (профиль профиля), я думаю, компилятор все равно не принял бы это из-за того, как работает привязка модели. Однако, если у вас есть Edit (int id, имя строки) по сравнению с Edit (имя строки), то я считаю, что вы можете использовать отдельные маршруты, чтобы перейти к правильному методу. Тем не менее, я согласен с тем, что, вероятно, лучше использовать отдельное действие и/или контроллер.   -  person dotariel    schedule 02.11.2010
comment
@Saint Я понимаю ваш пример, но не понимаю, почему компилятор не принимает Edit (пользователь-пользователь) и Edit (профиль профиля). Разве он не видит параметры такими же разными, как в вашем примере с Edit (int id, имя строки) и Edit (имя строки)? Или я все еще что-то упускаю?   -  person Rob    schedule 02.11.2010
comment
Итак, я просматривал этот ответ: stackoverflow.com/questions/894779/, и даже несмотря на то, что они используют настраиваемые атрибуты для достижения маршрутизации, определенно кажется, что возможен какой-то странный маршрут, который сопоставляется непосредственно с определенным действием, даже если это действие имени нет в URL. Итак, могу ли я вызвать одно действие EditProfile, а другое — EditUser и по-прежнему получать те же маршруты, что и раньше? (User/Edit/userID и User/Profile/Edit/profileID   -  person MegaMatt    schedule 02.11.2010
comment
К вашему сведению: я опубликовал новый, более четкий вопрос о том, что мы здесь обсуждаем: stackoverflow.com/questions/4080897/   -  person MegaMatt    schedule 02.11.2010
comment
@ Мэтт, хорошо. Из-за ограничения по времени я не могу сейчас продолжить обсуждение. Но проверю завтра утром. Меня очень интересует этот вопрос!   -  person Rob    schedule 02.11.2010


Ответы (1)


Когда фреймворк собирается выбрать, какое действие выполнить, сначала проверьте действия с требуемым именем с атрибутом HttpPost или HttpGet, которые соответствуют запросу, если таким образом не выбрано действие, затем он выбирает любое действие, соответствующее имени. Таким образом, если у вас есть два действия с одинаковым именем без атрибутов HttpPost или HttpGet, вы не можете контролировать выполнение действия.

person David Martinez    schedule 02.11.2010