После добавления маршрута верхнего уровня в aspnet mvc после завершения работы не связанная форма - PullRequest
1 голос
/ 04 ноября 2010

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

<form action="/Login/AuthenticateUser" method="post">
        <label for="username_or_email">Username or email</label>
        <input id="handle" name="handle" type="text" value="">
        <label for="password">Password</label>
        <input id="pass" name="pass" type="password" value="">
</form>

И 2 маршрута определены

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "User",
                "{controller}/{handle}",
                new { Controller = "User", action = "Index", handle = UrlParameter.Optional }
            );

            routes.MapRoute(
                "Default",
                "{controller}/{action}/{id}",
                new { controller = "Post", action = "Index", id = UrlParameter.Optional }
            );
        }

Это работало без проблем, и к нему был привязан следующий метод контроллера

[HttpPost]
public ActionResult AuthenticateUser(FormCollection collection)
{
    //some code here ...

    return View("Index");
}

Позже было решено, что мне нужен маршрут для непосредственного просмотра информации о пользователях, поэтому я хотел что-то вроде http://localhost/User/handle

Итак, я создал маршрут и могу просматривать его без проблем. Но в следующий раз, когда я попытался войти в систему с оригинальной формой (см. Выше), она никогда не попадет на метод http post в моем контроллере (а вместо этого на метод http get «Index»). Также обратите внимание - после появления этого сообщения URL в браузере выглядит корректно, в этом случае отображается http://localhost/Login/AuthenticateUser.

Странное поведение, несомненно, связано с новым маршрутом. Также обратите внимание - у меня нет маршрута, определенного для этого метода аутентификации пользователя.

Каким образом я могу заставить их работать вместе? Кроме того, что вызвало это странное поведение? Не верен ли сам маршрут?

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 04 ноября 2010

Следующий маршрут:

routes.MapRoute(
                "User",
                "{controller}/{handle}",
                new { Controller = "User", action = "Index", handle = UrlParameter.Optional }
            );

По умолчанию все ваши запросы направляются на действие Index. Вы не можете переопределить значение маршрута action, только значение маршрута handle. Таким образом, /Login/AuthenticateUser приводит вас к действию Index контроллера Login с handle как AuthenticateUser. Маршрут под ним никогда не будет использоваться, потому что {controller}/{handle} охватывает почти все запросы.

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

Обновление:

Если вы хотите использовать что-то общее, например {controller}/{string}, вам нужно убедиться, что никакие другие маршруты не конфликтуют с ним, и все равно все маршруты контроллеров / действий корректно выполняются. Я бы не рекомендовал использовать что-то общее, например {controller}/{string}, но один из способов это сделать, если вы сделаете так, чтобы ваши общие маршруты выглядели так:

routes.MapRoute(
         "User",
          "Page/{controller}/{action}",
          new { controller = "User", action = "Index" }
);

И поместите это выше {controller}/{string}. Опять же, наличие очень общей карты маршрутов к чему-то очень конкретному может вызвать головную боль в будущем.

1 голос
/ 04 ноября 2010

Установите этот отладчик маршрутов и используйте его, чтобы проверить, как выглядят ваши маршруты: http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

...