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
相关产品推荐
相关产品推荐

