powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Помогите составить маршрут
31 сообщений из 31, показаны все 2 страниц
Помогите составить маршрут
    #39104057
ughunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Есть контроллер Documents и в нем 3 действия Action() Action(int id) Action(string x)
Как заставить MVC вызывать нужные действия на контроллере? Как уже не пробовал - все одно: неоднозначность...
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39104412
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ughunter,
Переименовать в: Action1() Action2(int id) Action3(string x) или дать более осмысленные названия экшен методам.
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39104704
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ughunterЗдравствуйте!

Есть контроллер Documents и в нем 3 действия Action() Action(int id) Action(string x)
Как заставить MVC вызывать нужные действия на контроллере? Как уже не пробовал - все одно: неоднозначность...Реализовать своего наследника ActionMethodSelectorAttribute и использовать.
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39104786
ughunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axeleron,

Метод не применим - страницы проиндексированы.

В реалии конечно выглядит так: /Documents/Articles...
- при вызове /Documents/Articles - метод Articles()
- при /Documents/Articles/50 - метод Articles(int id)
- при /Documents/Articles/xxx - метод Articles(string tag)
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39104796
ughunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

Немножко более подробно пожалуйста. Если можно пример того, как использовать. Спасибо.
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39104806
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ughunter,

если делать по уму, то делат свою реализацию ActionMethodSelectorAttribute.
но можно попробовать использовать дефолтный биндер - у метода контроллера поставь значения по умолчанию int?, string - и посмотри как биндер будет обрабатывать твои адреса articles/1 и articles/tag.
может сработать - проверь
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39104827
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ughunterskyANA,

Немножко более подробно пожалуйста. Если можно пример того, как использовать. Спасибо.Подробности легко гуглятся.

А пример... Какой-то такой:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
[SelectActionByParameter(Name = "id")]
public ActionResult Articles(int id)
{
    /* ... */
}

[SelectActionByParameter(Name = "tag")]
public ActionResult Articles(string tag)
{
    /* ... */
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class SelectActionByParameterAttribute : ActionMethodSelectorAttribute
{
    public string Name { get; set; }

    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
    {
        return controllerContext.HttpContext.Request[this.Name] != null;
    }
}
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39104903
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAughunterskyANA,

Немножко более подробно пожалуйста. Если можно пример того, как использовать. Спасибо.Подробности легко гуглятся.

А пример... Какой-то такой:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
[SelectActionByParameter(Name = "id")]
public ActionResult Articles(int id)
{
    /* ... */
}

[SelectActionByParameter(Name = "tag")]
public ActionResult Articles(string tag)
{
    /* ... */
}



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class SelectActionByParameterAttribute : ActionMethodSelectorAttribute
{
    public string Name { get; set; }

    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
    {
        return controllerContext.HttpContext.Request[this.Name] != null;
    }
}



Из гаубицы по воробьям. Плохой пример.



ughunter,

Не слушай этих дядек, плохого насоветуют.

Вот то что надо: http://habrahabr.ru/post/78079/

Ещё

http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/creating-a-route-constraint-cs
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39104938
ughunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот все чего удалось достичь:

Текущий запрос для действия "Articles" на контроллере типа "DocumentsController" является неоднозначным на следующих методах действий:
System.Threading.Tasks.Task`1[System.Web.Mvc.ActionResult] Articles() на типе FishNSK.WebUI.Controllers.MvcApp.DocumentsController
System.Threading.Tasks.Task`1[System.Web.Mvc.ActionResult] Articles(Int32) на типе FishNSK.WebUI.Controllers.MvcApp.DocumentsController
System.Threading.Tasks.Task`1[System.Web.Mvc.ActionResult] Articles(System.String) на типе FishNSK.WebUI.Controllers.MvcApp.DocumentsController

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
routes.MapRoute(
                "Articles",
                "Documents/Articles/{id}",
                new { controller = "Documents", action = "Articles" },
                new { id = @"\d+" }
            );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );



что и где я делаю не так?
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39104994
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ughunterчто и где я делаю не так?hVostt-а слушаешь :)
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105143
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAughunterчто и где я делаю не так?hVostt-а слушаешь :)

Ню-ню

ээх... молодёж...

вариант №1

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public class DocumentsController : Controller
{

   public ActionResult Articles()
   {
       // ...
   }

   public ActionResult ArticlesByNumber(int id)
   {
       // ...
   }

   public ActionResult ArticlesByString(string id)
   {
       // ...
   }
}



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
           routes.MapRoute(
                "Articles1",
                "Documents/Articles",
                new { controller = "Documents", action = "Articles" }
            );

           routes.MapRoute(
                "Articles2",
                "Documents/Articles/{id}",
                new { controller = "Documents", action = "ArticlesByNumber" },
                new { id = @"\d{1,9}" }
            );

           routes.MapRoute(
                "Articles3",
                "Documents/Articles/{id}",
                new { controller = "Documents", action = "ArticlesByString" },
            );




вариант №2

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class DocumentsController : Controller
{
   
   [Route("Documents/Articles")]
   public ActionResult Articles()
   {
       // ...
   }

   [Route("Documents/Articles/{id:int}")]
   public ActionResult ArticlesByNumber(int id)
   {
       // ...
   }

   [Route("Documents/Articles/{id:alpha}")]
   public ActionResult ArticlesByString(string id)
   {
       // ...
   }
}




надо понимать, что маршруты это одно, а названия действий это другое.

когда называешь действия одинаково Articles, Articles, Articles... интересно, как фреймворк должен понять, чего хотел автор? с помощью встроенной гадалки?

просто голову надо включать и решать задачи теми инструментами, которые именно для этого предназначены, а не так, как советует skyANA -- прикатывать бульдозер с экскаватором, чтобы высадить молодое деревце.
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105148
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, вот ты клоун. Изначально поставленную задачу не решил, зато посмешил :) Так держать!
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105154
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAhVostt, вот ты клоун. Изначально поставленную задачу не решил, зато посмешил :) Так держать!

долго держался? бомбануло так бомбануло
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105159
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, я спокоен. Просто рассуждаю...

Ты прям выпячиваешь свой сарказм наружу.
Обычно так себя ведут клоуны, либо тролли, либо не уверенные в себе люди (уверенные просто говорят, что вот это решение будет лучше потому-то и потому-то).
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105161
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так чего-ты хочешь: повеселить нас, или пофлудить/потроллить, или таки что-то доказать/показать?
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105226
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAhVostt, я спокоен. Просто рассуждаю...

Ты прям выпячиваешь свой сарказм наружу.
Обычно так себя ведут клоуны, либо тролли, либо не уверенные в себе люди (уверенные просто говорят, что вот это решение будет лучше потому-то и потому-то).

skyANAТак чего-ты хочешь: повеселить нас, или пофлудить/потроллить, или таки что-то доказать/показать?

Когда человек переходит к всяческим искромётным и не очень оскорблениям, ща это называется ёмким словом «бомбит», так вот у тебя как раз сейчас бомбит.

Я дал правильное решение с самого начала, а ты дал неправильное. Можешь выдохнуть и успокоиться
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105244
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, хорошо, давай обсудим решение...

Изначальная постановка задачи, что озвучена автором: есть контроллер с тремя одинаково названными методами, но разной сигнатурой. Как заставить MVC вызывать нужные действия на контроллере?

В этой постановке твоё решение не верное, моё - да :)

Согласен, что возможно автору подойдёт и твоё, а может и нет. Пусть выбирает.
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105262
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAИзначальная постановка задачи, что озвучена автором: есть контроллер с тремя одинаково названными методами, но разной сигнатурой. Как заставить MVC вызывать нужные действия на контроллере?

Это задача маршрутизации. Давай абстрагируемся от ASP.NET, вот у тебя 3 вида адресов:

/documents/articles
/documents/articles/id -- где id это число
/documents/articles/tag -- где tag это НЕ число

И каждый из этих видов мы обрабатываем совершенно по-разному. Как выяснить, какому обработчику отдать запрос? С помощью маршрутизации. И эта задача решаема средствами маршрутизации ASP.NET MVC, и ДОЛЖНА решаться именно ей. Это правильно. Есть сотня других способов решить эту задачу через задницу, через ещё какие-нибудь отверстия, но они -- неправильные.


skyANAВ этой постановке твоё решение не верное, моё - да :)

Как бы тебе не хотелось в это верить, но нет.

Если бы речь шла о выборе правильного действия по другим атрибутам запроса, например, по заголовкам, или по атрибутам авторизации, или в зависимости от дня и ночи, которые совершенно точно выходят за рамки маршрутизатора, то можно было бы с уверенностью говорить, что твоё решение верное. Но это, увы, не так.

skyANAСогласен, что возможно автору подойдёт и твоё, а может и нет. Пусть выбирает.

Я со своей стороны порекомендовал автору игнорировать ваши костыли, и вместо этого использовать правильный подход.

Пусть выбирает, согласен.
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105274
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAВ этой постановке твоё решение не верное, моё - да :)

Как бы тебе не хотелось в это верить, но нет.

В той постановке твоё решение не верное, моё - да.

Возможно автор действительно решает другую задачу, а возможно ты притягиваешь это за уши.
Это надо у автора уточнять. Ты не уточнил, следовательно выдаёшь желаемое за действительное.
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105445
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAВ той постановке твоё решение не верное, моё - да.

Возможно автор действительно решает другую задачу, а возможно ты притягиваешь это за уши.
Это надо у автора уточнять. Ты не уточнил, следовательно выдаёшь желаемое за действительное.

Ты характеризуешься патологической неспособностью признать свою неправоту?

Зачем мне что-то уточнять, если я вижу в чём проблема и знаю весьма конкретное и правильное решение, которое и привёл? Когда мне что-то не понятно, я уточняю. Здесь всё понятно.
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105468
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,
перестань уже спорить. Все уже на форуме знают, что skyANA - самый умный и продвинутый программист. И как ты, возможно, уже замечал, он НИ разу пока не ошибся (не или не признал, что был неправ). А богом быть трудно (c) :)
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105474
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, кстати, добро пожаловать! Тебя тоже как и меня skyANA записал в клоуны. Я очень рад тому, что его лексикон помимо 'слив засчитан' пополнился новым словом. Так понимаю, чел сходил в цирк и познал новые слова. :)
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105522
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAВ той постановке твоё решение не верное, моё - да.

Возможно автор действительно решает другую задачу, а возможно ты притягиваешь это за уши.
Это надо у автора уточнять. Ты не уточнил, следовательно выдаёшь желаемое за действительное.

Ты характеризуешься патологической неспособностью признать свою неправоту?А в чём я не прав?

В твоём понимании задачи надо использовать RouteAttribute, в этом я согласен.
А в той постановке, что указал ТС, следует использовать своего наследника ActionMethodSelectorAttribute.

Возможно автору подходит твоё решение, так пусть его и использует, я не против. А возможно это тестовое задание, или ещё чего.
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105557
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAА в той постановке, что указал ТС, следует использовать своего наследника ActionMethodSelectorAttribute.

авторЕсть контроллер Documents и в нем 3 действия Action() Action(int id) Action(string x)
Как заставить MVC вызывать нужные действия на контроллере? Как уже не пробовал - все одно: неоднозначность...

Может я чего-то не понимаю, но тогда объясни, как эту постановку можно понять таким образом, что надо привлекать селектор, а не маршрутизатор? Именно в такой постановке задача решается через маршрутизацию.

Для чего нужен селектор? Ты предлагаешь написать свою реализацию класса, и использовать кастомный атрибут, вместо того, чтобы воспользоваться штатными средствами, специально для этого предназначенными, без написании лишнего, ненужного кода.

Для чего? Ты всегда так делаешь?
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105576
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, skyANA, в общем не ругайтесь. Если ТСу нужны 3 экшн метода с одинаковым именем Action, но разной сигнатурой, то 100% верное решение от skyANA, если такого строгого условия нет, то решение более верное у hVostt'а.
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105611
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronhVostt, skyANA, в общем не ругайтесь. Если ТСу нужны 3 экшн метода с одинаковым именем Action, но разной сигнатурой, то 100% верное решение от skyANA, если такого строгого условия нет, то решение более верное у hVostt'а.

Даже если имена самих экшенов менять нельзя хз по каким причинам, нужно использовать RouteAttribute.

Селектор нужен для других целей, для более сложной стратегии принятия решения в выборе экшена, и даже в этом случае это говорит о плохом дизайне и надо по возможности искать другое решение. Т.е. это костыль, когда ни вправо ни влево — никуда и приходится вертеться.
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105643
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAА в той постановке, что указал ТС, следует использовать своего наследника ActionMethodSelectorAttribute.

авторЕсть контроллер Documents и в нем 3 действия Action() Action(int id) Action(string x)
Как заставить MVC вызывать нужные действия на контроллере? Как уже не пробовал - все одно: неоднозначность...

Может я чего-то не понимаю, но тогда объясни, как эту постановку можно понять таким образом, что надо привлекать селектор, а не маршрутизатор? Именно в такой постановке задача решается через маршрутизацию.

Для чего нужен селектор? Ты предлагаешь написать свою реализацию класса, и использовать кастомный атрибут, вместо того, чтобы воспользоваться штатными средствами, специально для этого предназначенными, без написании лишнего, ненужного кода.

Для чего? Ты всегда так делаешь?Ты походу по психотипу своему 1-й Логик :)

У ТС дано три метода с одинаковым названием и разной сигнатурой . Одинаковым названием. Одинаковым. :)
Возникает ошибка: Ambiguous action method call. Ошибка эта исправляется без изменения названия методов реализацией и использованием наследника от ActionMethodSelectorAttribute.

Относительно вопроса: "Ты всегда так делаешь?". Нет я так не делаю.
Обычно я чётко формулирую задачу и обсуждаю её, а не сначала пишу код из трёх методов с одинаковым названием.

P.S.: для интереса можешь погуглить: "Ambiguous action method call + ActionMethodSelectorAttribute".
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105781
ughunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, господа!
Оба правы и не правы одновременно.
skyANA - дал верное решение в контексте поставленной задачи, а именно: если 3 метода с разной сигнатурой - то действительно без ActionMethodSelectorAttribute не обойтись. Единственно скорее нужно сделать так:
Код: c#
1.
return controllerContext.HttpContext.Request.RequestContext.RouteData.Values[Name] != null;


Однако Axeleron - тоже прав. Действительно если пойти по пути переименования методов на контроллере - его решение с точки зрения "правильности следования" именно концепции MVC - правильное.
Оба решения имеют право на жизнь ибо оба правильные.

НО! Следует заметить вот что, если переименовывать методы - мы ведь точно не знаем кто и где их вызывает? Такое в принципе возможно. Я бы с осторожностью отнесся к переименованию чего-либо в большом проекте.

Спасибо, Други! Вы очень помогли.
ПыСы - пришло понимание маршрутизации ))
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105960
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAУ ТС дано три метода с одинаковым названием и разной сигнатурой . Одинаковым названием. Одинаковым. :)
Возникает ошибка: Ambiguous action method call. Ошибка эта исправляется без изменения названия методов реализацией и использованием наследника от ActionMethodSelectorAttribute.

Эта ошибка исправляется БЕЗ создания дополнительного класса, с помощью RouteAttribute, ИЛИ с помощью MapRoute + изменение названия экшенов (причины, по которым нельзя изменить названия самих экшенов мне трудно представить, ведь URL не изменится).

Наследник селектора здесь нафиг не нужен.

skyANAОбычно я чётко формулирую задачу и обсуждаю её, а не сначала пишу код из трёх методов с одинаковым названием.

Ну а насчёт применяемых инструментов как? Берёшь инструменты, подходящие для решения задачи или берёшь что под руку попало? Другими словами, шуруп отвёрткой закручиваешь, или кривым кухонным ножом? Я вот к чему.

skyANAP.S.: для интереса можешь погуглить: "Ambiguous action method call + ActionMethodSelectorAttribute".

Мне он никогда не был нужен, хотя я знаю о нём. Необходимость в его применении это уже сам по себе факт косяка в архитектуре. При чём косяк очень конкретный!
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39105964
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ughunterесли 3 метода с разной сигнатурой - то действительно без ActionMethodSelectorAttribute не обойтись

Бред. Я уже приводил решение, где прекрасно без него можно обойтись. При чём 2 штуки.


ughunterОба решения имеют право на жизнь ибо оба правильные.

Задачи с маршрутизацией надо решать средствами маршрутизации, а не хернёй страдать. Сколько уж говорить можна-то. Нет здесь решений с правом на жизнь типа. Есть очень конкретные инструменты для своих задач и правильно -- это использовать подходящие инструменты.


ughunterСпасибо, Други! Вы очень помогли.
ПыСы - пришло понимание маршрутизации ))

Да не за что )) Обращайся!
...
Рейтинг: 0 / 0
Помогите составить маршрут
    #39106661
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДругими словами, шуруп отвёрткой закручиваешь, или кривым кухонным ножом? Я вот к чему.Давеча менял смеситель на кухне, так обошёлся разводным ключом, не стал за 100 баксов кулачковый покупать, что идеально подошёл бы.
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Помогите составить маршрут
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]