如何在ASP.NET MVC的View中调用Controller中的方法并传递参数
问题原因梳理
你之前尝试的代码是在视图渲染阶段同步调用控制器方法,不符合你「点击按钮后触发传参」的业务需求,而且报错找不到命名空间是因为你没有在视图顶部引入HomeController所属的命名空间,加@using 你的项目名.Controllers就能解决,但这种写法完全不适合你的业务场景,不需要再用。
你现有代码还有三个核心错误:
- 你的
selectOrdena方法标记了[HttpPost],但@Html.ActionLink生成的是GET请求,请求方式不匹配根本访问不到方法 - 第二个视图里嵌套了两层form标签(外层
Html.BeginForm生成了form,内层又手动写了<form>),会导致表单提交逻辑异常 Html.BeginForm的控制器名参数写错了,MVC约定控制器名不需要加Controller后缀,应该写Producto而不是ProductoController
推荐实现方案
方案1:AJAX无刷新调用(最符合你的模态框业务场景)
不需要跳转页面,点击添加后直接在后台执行插入逻辑,用户体验更好。
第一步:修改控制器方法
[HttpPost] // 改成返回JsonResult方便前端接收处理结果 public ActionResult selectOrdena(string id) { try { client = new FireSharp.FirebaseClient(config); FirebaseResponse responseProdu = client.Get("Producto/" + id); Producto dataProdu = JsonConvert.DeserializeObject<Producto>(responseProdu.Body); // 这里补充你插入新表格的逻辑 // ... return Json(new { success = true, msg = "添加成功" }); } catch (Exception ex) { return Json(new { success = false, msg = ex.Message }); } }
第二步:修改第二个视图的按钮绑定逻辑
把原来的@Html.ActionLink改成带自定义类的按钮,加Ajax绑定:
<!-- 把原来的ActionLink替换成这个按钮 --> <button type="button" class="btn btn-primary agregar-btn" data-id="@item.idProducto">Agregar</button> <!-- 页面底部加jQuery脚本 --> @section Scripts{ <script> $(".agregar-btn").click(function(){ var productId = $(this).data("id"); $.post('@Url.Action("selectOrdena","Producto")', {id: productId}, function(res){ if(res.success){ alert(res.msg); // 可以在这里写刷新父页面列表、关闭模态框的逻辑 $('#lista').modal('hide'); }else{ alert("添加失败:" + res.msg); } }) }) </script> }
同时删除第二个视图里多余的内层<form>标签,修正外层的Html.BeginForm参数即可。
方案2:表单提交跳转(不需要无刷新的场景)
如果你不需要无刷新效果,把selectOrdena的[HttpPost]改成[HttpGet],执行完插入逻辑后返回RedirectToAction("你原来的视图名")跳回之前的页面即可。
内容的提问来源于stack exchange,提问作者Dennis Fernández
相关产品推荐
相关产品推荐

