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

ASP.NET MVC中如何将ID传递给控制器的Action方法?

解决Html.BeginForm传递路径ID到控制器Action的问题

问题分析

你需要通过Html.BeginForm生成形如/BuyTourTicket/tourid的路径,将ID传递给BuyTourTicket的Post方法,但当前无法实现。核心问题是表单未正确生成包含ID的路由URL,或者路由配置未匹配带参数的请求。

解决方案

1. 确认路由配置

首先检查RouteConfig.cs中的路由规则,确保存在支持{controller}/{action}/{id}格式的路由,默认路由通常已经包含:

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

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

如果自定义了路由,需保证BuyTourTicket的路由允许接收id参数。

2. 正确使用Html.BeginForm生成带ID的路径

在TourTicket视图中,使用Html.BeginForm时指定路由值,将tourid(从ViewBag或模型中获取)作为路径参数传递:

方式一:直接指定控制器、动作和路由参数

@* 替换YourControllerName为实际控制器名称,比如TourController就写"Tour" *@
@using (Html.BeginForm("BuyTourTicket", "YourControllerName", new { id = ViewBag.tourid }, FormMethod.Post))
{
    <!-- 表单其他内容 -->
    <input type="submit" value="提交预订" />
}

这样生成的表单action会是/YourControllerName/BuyTourTicket/xxx(xxx为实际tourid),Post请求会匹配到带int id参数的BuyTourTicket方法。

方式二:使用路由名称(可选)

如果在路由配置中定义了专门的路由:

routes.MapRoute(
    name: "BuyTourTicketRoute",
    url: "BuyTourTicket/{id}",
    defaults: new { controller = "YourControllerName", action = "BuyTourTicket", id = UrlParameter.Optional }
);

则视图中可以用Html.BeginRouteForm:

@using (Html.BeginRouteForm("BuyTourTicketRoute", new { id = ViewBag.tourid }, FormMethod.Post))
{
    <!-- 表单内容 -->
    <input type="submit" value="提交预订" />
}

3. 验证ViewBag.tourid的有效性

确保TourTicket方法中ViewBag.tourid已正确赋值,建议增加空值判断避免异常:

var tour = db.TBLTUR.Find(id);
if(tour != null)
{
    ViewBag.tourid = tour.id;
    ViewBag.tourname = tour.tur_basligi.ToString();
    ViewBag.kalkisYeri = tour.kalkis_yeri.ToString();
    ViewBag.tarih = tour.tarih.ToString();
    ViewBag.detaylar = tour.detay.ToString();
    var tourYetkili = db.TBLTURYETKILISI.Find(id);
    if(tourYetkili != null)
    {
        ViewBag.turYetkilisi = tourYetkili.ad + " " + tourYetkili.soyad;
    }
}

4. 备选:用隐藏字段传递(非路径参数)

如果不需要路径参数,仅需传递ID到Post方法,也可以在表单中添加隐藏字段:

@using (Html.BeginForm("BuyTourTicket", "YourControllerName", FormMethod.Post))
{
    @Html.Hidden("id", ViewBag.tourid)
    <!-- 表单其他内容 -->
    <input type="submit" value="提交预订" />
}

这种方式会将ID作为表单数据提交,而非路径参数,同样能被Post方法接收。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:39:14