You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

提交订单处理器失效:跳转404且断点未触发,求技术排查

问题描述

点击提交订单按钮后跳转到404错误页面,调试断点无法命中OnPostPlaceOrder方法。修改cshtml表单代码后仍未生效,需实现正常提交订单并跳转到确认页面,至少能调试该方法。

相关代码

页面模型处理器方法

[ValidateAntiForgeryToken]
public IActionResult OnPostPlaceOrder()
{
    try
    {
        if (!_userManager.UserIsGuest())
        {
            int? customerID = _customerManager.GetCustomerId();
            if (customerID.HasValue)
            {
                var rentalOrder = new RentalOrder
                {
                    CustomerID = customerID.Value,
                    RentalStartDate = DateTime.Now,
                    RentalEndDate = DateTime.Now.AddDays(7), 
                    TotalCost = _rentalOrderManager.CalculateTotalCost(Cart), 
                    Status = OrderStatus.Pending,
                    StartTime = TimeSpan.FromHours(8), 
                    EndTime = TimeSpan.FromHours(18) 
                };

                int orderId = _rentalOrderManager.PlaceOrder(Cart, rentalOrder);

                return RedirectToPage("/OrderConfirmation", new { orderId });
            }
        }

        return Page();
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "An error occurred in OnPostPlaceOrder method");
        return RedirectToPage("/Error");
    }
}

public IActionResult OnPostRemoveFromCart(int ItemID)
{
    _cartManager.RemoveItemFromCart(Cart, ItemID);
    return RedirectToPage("/Cart");
}

表单代码

<form method="post" asp-page-handler="PlaceOrder">
    <button type="submit" class="btn btn-primary">Place Order</button>
</form>

Startup配置

using BusinessLogicLayer;
using DataAccessLayer;
using SharedClassesLibrary;
using System.Text;

namespace WebApp
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

    }

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
            services.AddScoped<DataAccess>();
            services.AddScoped<ICustomerRepository, CustomerRepository>();
            services.AddScoped<IUserRepository, UserRepository>();
            services.AddScoped<IUserManager, UserManager>();
            services.AddScoped<IGuestManager, GuestManager>();
            services.AddScoped<IRentalItemRepository, RentalItemRepository>();
            services.AddScoped<IRentalItemManager, RentalItemManager>();
            services.AddScoped<IRentalOrderManager, RentalOrderManager>();
            services.AddScoped<RentalOrderManager>();
            services.AddScoped<ICustomerManager, CustomerManager>();

            services.AddScoped<ICartRepository, CartRepository>();
            services.AddScoped<CartManager>();
            services.AddScoped<IRentalItemService, RentalItemService>();
            services.AddHttpContextAccessor();
            services.AddDistributedMemoryCache();
            services.AddSession(options =>
            {
                options.Cookie.Name = "CookieMonster";
                options.IdleTimeout = TimeSpan.FromMinutes(300);
            });
        }


        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseAuthorization();

            app.UseSession();

            app.Use(async (context, next) =>
            {
                var userManager = context.RequestServices.GetRequiredService<IUserManager>();
                var httpContext = context;
                var guestManager = context.RequestServices.GetRequiredService<IGuestManager>(); 
                if (userManager.UserIsGuest() && !httpContext.Session.TryGetValue("GuestIdentifier", out byte[] sessionValue))
                {
                    var guestIdentifier = guestManager.GenerateNewGuestIdentifier();
                    httpContext.Session.Set("GuestIdentifier", Encoding.UTF8.GetBytes(guestIdentifier));
                }
                await next();
            });
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");

                endpoints.MapRazorPages();
            });

        }
    }
}

排查与解决方案

1. 防伪令牌缺失导致请求拦截

处理器方法标注了[ValidateAntiForgeryToken],但表单中未包含防伪令牌,会导致请求被拦截,表现为404或400错误。
修复: 在表单内添加防伪令牌:

<form method="post" asp-page-handler="PlaceOrder">
    @Html.AntiForgeryToken()
    <button type="submit" class="btn btn-primary">Place Order</button>
</form>

2. 表单目标页面未明确指定

如果表单所在页面的路由存在歧义,需明确指定提交目标页面:

<form method="post" asp-page="/Cart" asp-page-handler="PlaceOrder">
    @Html.AntiForgeryToken()
    <button type="submit" class="btn btn-primary">Place Order</button>
</form>

3. 页面模型类未继承PageModel

Razor Pages处理器方法必须定义在继承自PageModel的类中,否则无法被识别:

public class CartModel : PageModel
{
    // 你的处理器方法和属性
}

4. 重复注册服务引发潜在异常

Startup中IRentalOrderManager被重复注册,可能导致依赖注入异常,建议移除重复项:

// 保留接口注册即可
services.AddScoped<IRentalOrderManager, RentalOrderManager>();
// 移除此行:services.AddScoped<RentalOrderManager>();

5. 调试步骤验证

  • 打开浏览器开发者工具(F12)→ 网络标签,查看提交订单时的请求URL和状态码,确认是否为目标页面的handler=PlaceOrder路由
  • 暂时移除[ValidateAntiForgeryToken]特性,测试是否能命中断点,排查令牌验证问题
  • 简化处理器方法逻辑,直接返回跳转,排除业务逻辑干扰:
    [ValidateAntiForgeryToken]
    public IActionResult OnPostPlaceOrder()
    {
        return RedirectToPage("/OrderConfirmation", new { orderId = 1 });
    }
    

内容的提问来源于stack exchange,提问作者mimi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:57:16