2010-07-21 2 views
0

Итак, у меня возникла странная проблема с маршрутом в моем приложении. По какой-то причине это просто не будет соответствовать. Он выглядит как {controller}/Comments/Put и имеет соответствующие ограничения, чтобы убедиться, что он попадает в правый контроллер, в данном случае «Misc». Когда я отправляю на маршрут, он просто не соответствует ...MVC 2 Проблема с маршрутами (ошибка?)

Я подключил библиотеку RouteDebugger, и в нем говорится: «Нет совпадения!», НО, когда я смотрю на таблицу маршрутов, тот, который выкапывает имеет зеленый «True» в колонке «Match», поэтому я немного проигрываю. Как он может совпадать и не совпадать в одно и то же время?

Я зашел так далеко, как закомментировал ВСЕ другие маршруты для приложения, и я все равно получаю тот же результат.

Когда-то это сработало, когда я сменил маршрут на что-то глупое долго, но потом я получил еще одну ошибку, в которой говорится, что я не могу отправить на мероприятие, потому что он был украшен [HttpPut], НО, я имел HttpMethodOverride как часть сообщения ... Во всяком случае, это еще одна глупая ошибка, которая даже не должна происходить, но опять же, что можно сказать обо всех ошибках.

Idk, если это имеет значение, оно не должно ..., но действие, которое нужно вызвать, является действием RedirectToRouteResult.

EDIT: Я также попытался положить маршрут на самом верху списка, так что получить никогда называют первым, до сих пор никаких изменений ...

Во всяком случае, если кто-то может указывать мне, почему маршрут неудачно, я был бы очень признателен!

Заранее благодарен!

EDIT 2: Чтобы прояснить немного больше, приложение предназначено для публикации коротких сообщений, а затем комментирования этих сообщений.

Публикация сообщения отлично работает через контроллер Ajax с маршрутом Ajax/Post/Put, который соответствует {controller}/Post/Put. Как вы можете заметить, маршруты очень похожи, но они не противоречат друг другу. Каждый маршрут имеет ограничение контроллера в виде controller = new ControllerConstraint("Ajax") или controller = new ControllerConstraint("Misc").

EDIT 3: Чтобы уточнить немного больше раз, вот контроллер/действие, которое следует назвать и маршрут в Global.asax:

MiscController : BaseController { 
    [HttpPut, ValidateAntiForgeryToken] 
    public RedirectToRouteResult PutComment(
     [Bind(Prefix = "Comment", Include = "Text")] Comment Comment) { 
     // Do stuff... 
    } 
} 

Routes.MapRoute("Misc (Put Comment)", "{controller}/Comments/Put", new { 
    action = "PutComment" 
}, new { 
    controller = new ControllerConstraint("Misc") 
}); 

EDIT 4: жесткого написания маршрут следующим образом не имеет никакого эффекта:

Routes.MapRoute("Misc (Put Comment)", "Misc/Comments/Put", new { 
    controller = "Misc", 
    action = "PutComment" 
}); 

EDIT 5: я прошла и упрощенную все маршруты, не более Params в Ур l и больше ограничений. Таким образом, маршруты выглядеть следующим образом:

Routes.MapRoute("Misc (Comments)", "Misc/Comments", new { 
    controller = "Misc", 
    action = "Comments" 
}); 

Итак, теперь, когда маршрут полностью жестко не должно быть никаких расхождений о не совпадающих маршрутов. Простой и простой ... или это ...

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

Итак, продолжая, я решил повторить ту же попытку по почте, но на этот раз, позволяя отладчику маршрута дать мне следующее: Маршрут по-прежнему не соответствует, YET в таблице маршрутов, он указан зеленым цветом как соответствующий , ПРОТИВОРЕЧИЯ up a ** !!!

Итак, проглотив еще одну ошибку BS, я решил отключить любой другой маршрут, а также любой другой метод от всех других контроллеров.

Угадайте, что, я ВСЕ ЕЩЕ ЖЕ ЖЕ РЕЗУЛЬТАТЫ! Это похоже на то, что каркас полностью сходит с SUPER MEGA HERP-A-DE-DERP ...

Я очень расстроен. Я написал приложения с гораздо большей сложностью, чем этот простой пост/комментарий приложения и я никогда не столкнулся так много трудностей ...

Я просто не знаю больше ...

:: идет к углу, скручивается и начинает плакать ::

+0

Если вы могли бы предоставить более подробную информацию о том, как вы добавили маршруты, мы могли бы помочь. вы говорите, что вы вызываете 'Misc/Comments/Put' или вы помещаете' {controller}/Comments/Put' в словарь сопоставлений маршрутов? если да, дайте нам несколько подробностей о том, как вы делитесь им с таблицей маршрутов. –

+0

Я вызываю '/ Misc/Comments/Put' через сообщение формы, которое должно соответствовать'/{controller}/Comments/Put' с 'ControllerConstraint (« Misc »)'. Это не так. Другой аналогичный маршрут '/ Ajax/Posts/Put' работает отлично, а также имеет' ControllerConstraint («Ajax») ', так что они не конфликтуют. Надеюсь, что это поможет немного больше. – Gup3rSuR4c

ответ

0

Итак, я понял, думаю, но в любом случае он работает сейчас.

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

Моя вторая ошибка, что я не перенаправлял правильно, или, в частности, я не указывал контроллер для перенаправления. В свою очередь, перенаправление пыталось перенаправить на действие, которое не было в одном контроллере.

Я сделал это, и это то, где он становится немного противоречивым, получить исключение HttpVerb пару раз. Я могу только предположить, что я вызывал исходное действие, а затем перенаправлялся на существующее действие, но перенаправление сохраняло HttpVerb, тем самым вызывая исключение во втором действии. Однако это все еще похоже на объяснение BS, которое, вероятно, неверно, но это лучший способ понять это.

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

В любом случае, надеюсь, что это поможет кому-то в будущем.

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