c# - 在 ASP.NET Core MVC 中将表单发布到 Controller 不起作用

标签 c# asp.net-core-mvc

我正在尝试以与 ASP.NET MVC 5 相同的方式将表单发布到我的 Controller ,但它不起作用。

Controller :

[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 没有传递 Controller 路径:

enter image description here

启动.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?}");
        });
}

最佳答案

它在表单上显示 action="/" 而不是 action="/Home/Login",因为您已将默认路由设置为 /主页/登录:

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

如果更改默认路由,它将正确显示。

我已经尝试过您的代码,问题出在您的模型绑定(bind)中。

首先,您需要删除 [FromBody],因为您是从表单而不是请求正文接收数据。

此外,您的表单无法正确发布数据,因为您没有设置 name 属性或对用于绑定(bind)输入的输入使用 asp-for 标记帮助程序' 根据操作参数建模的数据。

最后,请参阅我的假设登录模型的完整演示:

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

Login.cshtml(添加 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 操作:

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

关于c# - 在 ASP.NET Core MVC 中将表单发布到 Controller 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60766974/

相关文章:

c# - 为什么在Nuget上找到的包不是最新版本?

c# - 共享服务器上 PersistKeysToFileSystem 的文件路径

razor - 从 asp.net core 中的中间件返回现有的 Razor View

c# - 为什么要在 char 上使用定界符?基于c的

c# - 迁移到 AutoMapper 5 - 循环引用

c# - 如何在 ASP.NET Core MVC 中请求并显示实时 Web api 数据?

c# - 在 asp.net core web api 中获取 Request.Form.Files 始终为空

c# - ASP.NET 中的 SetFocus() 和 Focus() 有什么区别?

c# - Directory.GetFiles : how to get only filename, 不是完整路径?

c# - Html.Grid 找不到明显存在的模型属性