Форма не попадает в контроллер - PullRequest
10 голосов
/ 17 мая 2019

Отредактировал вопрос, поскольку я обнаружил, что проблема не в бритве, а вместо этого в маршруте

У меня есть очень простая форма входа, но как-то,когда пользователь нажимает «Войти», страница переходит на страницу «Ошибка 404», и по какой-то причине она просто не попадает на контрольные точки контроллера.

   @using (Html.BeginRouteForm("MyCustomRoute", new { controller = "login", action = "verify", FormMethod.Post }))
                 {
                <fieldset class="clearfix">
                    <p><span style="float:none;color:black; font-size:20pt;"></span></p>
                    <p><span style="float:none;color:black; font-size:20pt;"></span></p>
                    <p><span class="fa fa-user"></span>@Html.TextBoxFor(m => m.UserName, new { @class = "form-control", placeholder = "Username", onkeydown = "convertTabtoEnter(this, event)", autofocus = "" })</p> <!-- JS because of IE support; better: placeholder="Username" -->
                    <p>
                        <span class="fa fa-lock"></span>@Html.PasswordFor(m => m.Password, new { @class = "form-control", placeholder = "Password", onkeyup = "convertTabtoEnter()" })
                    </p> <!-- JS because of IE support; better: placeholder="Password" -->

                    <div>
                        <span style="width:48%; text-align:left;  display: inline-block;">
                            <a class="small-text" href="#">
                                @*Forgot
                    password?*@
                            </a>
                        </span>
                        <span style="width:50%; text-align:right;  display: inline-block;"><input type="submit" value="Sign In"></span>
                    </div>
                </fieldset>
                <div class="clearfix"></div>
                }    

И внутри моего контроллера входа у меня есть простой ActionResult с именем «Подтвердить» с 2 параметрами.

    [RoutePrefix("Login")]

public class LoginController : Controller
{
    // GET: Login
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    [Route("Verify")] //Matches GET login/verify

    public ActionResult Verify(string username, string password)
    {...}

Что именно я здесь не так делаю?Это не похоже на ракетостроение.

Edit2: я заметил, что всякий раз, когда я изменяю RouteConfig.cs обратно на значение по умолчанию, он работает правильно.Итак, проблема не в тегах формы, а в маршрутизации.Поэтому я пытался добавить собственный маршрут, чтобы заставить это работать, используя этот пример: Использование Html.BeginForm () с пользовательскими маршрутами

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

            routes.MapRoute(
                name: "TrailersOverview",
                url: "{TrailersOverview}/{action}/{vendid}",
                defaults: new { controller = "TrailersOverview", action = "Index", vendId = UrlParameter.Optional }
            );

             routes.MapRoute(
                "MyCustomRoute", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "login", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

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

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

Ответы [ 4 ]

5 голосов
/ 17 мая 2019

Есть несколько вещей, которые кажутся неправильными:

  • Ваш контроллер отсутствует в конфигурации маршрута.
  • Имена действий и контроллеров расположены в неправильном порядке.

RouteConfig:

Маршрут по умолчанию выглядит так:

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

Форма:

Если вы хотите использовать Tag Helpers, вам нужно изменить код с:

<form action="@Url.Action("Login", "Verify")" method="post">

до:

<form asp-controller="Login" asp-action="Verify" method="post">

Взгляните здесь .

1 голос
/ 24 мая 2019

Ваш пользовательский маршрут (второй в вашем коде RegisterRoutes выше) кажется неправильным ... в зависимости от того, что вы заявили выше, он может / должен быть таким:

routes.MapRoute(
    "MyCustomRoute", // Route name
    "Login/Verify", // (No parameters needed)
    new { controller = "Login", action = "Verify" } // Parameter defaults
);

С этой настройкойизмените первую строку вашего кода бритвы следующим образом:

@using (Html.BeginRouteForm("MyCustomRoute", FormMethod.Post }))
{
    <fieldset class="clearfix">
    ...
}

Использование Html.BeginRouteForm автоматически использует значения по умолчанию, указанные в вашем пользовательском маршруте;Не нужно добавлять значения по умолчанию в Razor.Использование FormMethod.Post в качестве второго параметра отобразит метод вашей формы как POST.

Edit: Давайте исправим вашу общую проблему с маршрутом.Вы пытаетесь использовать Attribute Routing, которая хорошо описана здесь: https://www.dotnettricks.com/learn/mvc/understanding-attribute-routing-in-aspnet-mvc. Я бы сказал, что в этом нет необходимости.

Сначала исправьте ваш маршрут по умолчанию (последний маршрут в вашемRegisterRoutes код) примерно так:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional });
    // Change the 'controller' and 'action' parameters here to point to the Main page in your application.

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

Далее, закомментируйте атрибуты Route и RoutePrefix в вашем контроллере входа ... вряд ли есть необходимость в директиве [Route("Verify")], есливы используете 'RegisterRoutes' правильно.

// [RoutePrefix("Login")]
public class LoginController : Controller
{
    // GET: Login
    public ActionResult Index()
    {
        return View();
    }
    [HttpPost]
    // [Route("Verify")] //Matches GET login/verify
    public ActionResult Verify(string username, string password)
    {...}
}

Теперь, когда маршрут по умолчанию настроен правильно, URL / Login должен перевести вас на экран входа в систему, потому что действие по умолчанию - «Index»(это значение по умолчанию в вашем маршруте по умолчанию выше.)

1 голос
/ 17 мая 2019
 @using (Html.BeginForm("Verify", "YourControllerName", FormMethod.Post))
{ your form here // }

Пожалуйста, попробуйте это, если это работает!

Еще одна вещь: добавьте атрибут name в поля ввода, который должен быть похож на имя свойства в вашей модели, например

@Html.TextBoxFor(m => m.UserName, new { @class = "form-control", id="username", name="USERNAME"})

И это имя пользователя должно быть в вашей модели, например:

Public class yourModel{Public string USERNAME{get;set;}}

И используйте ваш объект модели в вашем методе действия для извлечения данных.

0 голосов
/ 19 мая 2019

Попробуйте добавить routes.LowercaseUrls = true; в конфигурацию вашего маршрута, поскольку вы предпочитаете строчные версии маршрутов:

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

            routes.LowercaseUrls = true;

            routes.MapRoute(
                name: "TrailersOverview",
                url: "{TrailersOverview}/{action}/{vendid}",
                defaults: new { controller = "TrailersOverview", action = "Index", vendId = UrlParameter.Optional }
            );

             routes.MapRoute(
                "MyCustomRoute", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "login", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

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

А для маршрута по умолчанию, я думаю, вы хотели упомянуть {*}, чтобы URL соответствовал всем остальным?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...