Отправить форму на контроллер в ASP. NET Core MVC не работает - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь отправить форму в мой контроллер так же, как я делал это с ASP. NET MVC 5, но он не работает.

Контроллер:

[HttpGet]
public IActionResult Login()
{
    return View();
}

[HttpPost]
public async Task<IActionResult> Login([FromBody] Login LoginModel)
{
    return View();
} 

И HTML

<form asp-action="Login" asp-controller="Home" method="post" class="mt-4">
    <div class="row">
        <div class="col-lg-12">
            <div class="form-group">
                <label class="text-dark" for="uname">E-mail</label>
                <input class="form-control" id="uname" type="text"
                       placeholder="digite e-mail">
            </div>
        </div>
        <div class="col-lg-12">
            <div class="form-group">
                <label class="text-dark" for="pwd">Senha</label>
                <input class="form-control" id="pwd" type="password"
                       placeholder="digite sua senha">
            </div>
        </div>
        <div class="col-lg-12 text-center">
            <button  type="submit" class="btn btn-block btn-dark" />
        </div>
    </div>
</form>

Я попытался использовать помощника:

@using (Html.BeginForm("Login", "Login", FormMethod.Post))
{
}

Но сгенерированный HTML не проходит путь контроллера:

enter image description here

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages().AddRazorRuntimeCompilation();
    services.AddControllersWithViews();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Login}/{id?}");
        });
}

1 Ответ

1 голос
/ 20 марта 2020

Показывает action="/" вместо action="/Home/Login" в форме, поскольку вы установили маршрут по умолчанию как /Home/Login:

app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Login}/{id?}");
    });

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

Я попробовал ваш код, и проблема в привязке модели.

Во-первых, вам нужно удалить [FromBody], поскольку вы получаете данные из формы, а не из тела запроса.

Кроме того, ваша форма неправильно публикует данные, так как вы не задали атрибут name или не используете тег-помощник asp-for для своих входов, которые используются для привязки данных входов к модели на параметрах действия.

Наконец, посмотрите мое полное демо с моим предположением Login модель:

public class Login
{
    public string uname { get; set; }
    public string pwd { get; set; }
}

Login.cs html (добавьте атрибут name, который равен именам свойств модели Login):

<form asp-action="Login" asp-controller="Home" method="post" class="mt-4">
    <div class="row">
        <div class="col-lg-12">
            <div class="form-group">
                <label class="text-dark" for="uname">E-mail</label>
                <input class="form-control" name="uname" id="uname" type="text"
                       placeholder="digite e-mail">
            </div>
        </div>
        <div class="col-lg-12">
            <div class="form-group">
                <label class="text-dark" for="pwd">Senha</label>
                <input class="form-control" name="pwd" id="pwd" type="password"
                       placeholder="digite sua senha">
            </div>
        </div>
        <div class="col-lg-12 text-center">
            <button type="submit" class="btn btn-block btn-dark" />
        </div>

    </div>
</form>

POST action:

[HttpPost]
public async Task<IActionResult> Login(Login LoginModel)
...