首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASP.NET MVC核心Html.BeginForm()总是链接到控制器中的第一动作

ASP.NET MVC核心Html.BeginForm()总是链接到控制器中的第一动作
EN

Stack Overflow用户
提问于 2022-09-03 19:37:40
回答 2查看 248关注 0票数 0

Html.BeginForm()函数有一个问题,每当我在_Prijava.cshtml中按下OkButton提交时,它都会在Controller中运行Prijava()操作。

这是LoginController.cs

代码语言:javascript
运行
复制
namespace BumCoreWebAppMVC.Controllers
{
    [Route("[controller]/[action]")]
    public class LoginController : Controller
    {
        [HttpGet] 
        [Route("/bum/Prijava.cshtml")]   
        public IActionResult Prijava()
        {
            var model = new LoginViewModel();
            return View("Prijava", model);
        }

        [HttpPost]
        public IActionResult OkButton(LoginViewModel model)
        {
            //...
            return View("Index");
        }
    }
}

这是视图Prijava.cshtml

代码语言:javascript
运行
复制
@model BumCoreWebAppMVC.Models.LoginViewModel
@{
    ViewData["TitleHeader"] = "Prijava";
    Layout = "./BumLayout";
}
<!-- ... -->
@await Html.PartialAsync("/Views/Login/_Prijava.cshtml", Model)
<!-- ... -->

这是部分视图_Prijava.cshtml

代码语言:javascript
运行
复制
@model BumCoreWebAppMVC.Models.LoginViewModel
@{}
@using (Html.BeginForm("OkButton", "Login", FormMethod.Post)){
    @Html.TextBoxFor(p => p.TextBox_ID, new {@class="form-control ", placeholder = "ID"})       
    <button type="submit">Submit</button>
}

据我所见,这应该是可行的。我怀疑我的Program.cs设置不正确:

代码语言:javascript
运行
复制
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();
builder.Services.AddHttpContextAccessor();
builder.Services.AddSingleton<HttpContextAccessor>();
builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseSession();
app.UseRouting();
app.UseAuthorization();
app.MapControllers();

app.Run();

奇怪的是,如果我将OkButton()操作更改为[HttpGet]并使用@Html.ActionLink("Submit", "OkButton", "Login"),它就能很好地工作,并且可以找到正确的操作。然而,Html.BeginForm("OkButton", "Login", FormMethod.Get)仍然无法运行它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-04 23:59:16

我找到了最令人难以置信的解决方案。

第一个@using (Html.BeginForm())似乎总是调用错误的操作,但下一个操作将正确工作。因此,简单地将@using (Html.BeginForm()){ }添加到_Prijava.cshtml页面的顶部将使其他页面正常工作。

票数 0
EN

Stack Overflow用户

发布于 2022-09-03 21:21:52

这是因为您没有在文件中设置属性路由。

解决方案资源管理器中,导航到App_Start文件夹并打开RouteConfig.cs文件。

添加下面一行:下面的routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

代码语言:javascript
运行
复制
routes.IgnoreRoute...;
routes.MapMvcAttributeRoutes();

最后一步:不要在Route属性的开头使用尾随斜杠。用这条线代替你的路线

代码语言:javascript
运行
复制
[Route("bum/Prijava.cshtml")]

演示视频

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73594986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档