ASP.NET Core 6:单表单单提交按钮调用同一控制器双方法的技术问询
需求:单个表单提交按钮触发同一控制器的两个方法(无JavaScript)
我正在使用ASP.NET Core 6开发,现需实现:通过单个ASP表单的单个提交按钮,将视图中的数据发送至同一控制器的两个不同方法。目前未找到无需JavaScript的实现方式,特此咨询可行方案。
控制器代码
namespace ACS.Controllers { public class MAWBController : Controller { private ProductContext _productContext; public MAWBController (ProductContext productContext) { _productContext = productContext; } public static List<Models.Shipment> listaMAWB = new List<Shipment>(); [HttpGet] public IActionResult InsertMAWB() { return View(); } [HttpPost] public IActionResult InsertMAWB(Shipment model) { if (ModelState.IsValid) { _productContext.Shipments.Add(model); _productContext.SaveChanges(); return RedirectToAction("Manipulacija"); } else { return View(model); } } public IActionResult Manipulacija() { return View(); } public IActionResult ShowListMAWB() { return View(listaMAWB); } public IActionResult IzracunTotalaPdv(decimal Manipulacija, decimal DgHandling,decimal PDV) { Shipment shipment = new Shipment(); decimal UkupnoSPDV = shipment.UkupnoSPDV(Manipulacija, DgHandling, PDV); ViewBag.UkupnoSPDV = UkupnoSPDV; return View(shipment); } } }
视图代码
@model ACS.Models.Shipment <form asp-action="InsertMAWB" method="post"> <label asp-for="ArrivalDate"></label> <input asp-for="ArrivalDate" /> <span asp-validation-for="ArrivalDate" class="text-danger"></span> </br> </br> <label asp-for="MAWB"></label> <input asp-for="MAWB" /> <span asp-validation-for="MAWB" class="text-danger"> </span> </br> </br> <label asp-for="GrossWeight"></label> <input asp-for="GrossWeight" /> <span asp-validation-for="GrossWeight" class="text-danger"> </span> </br> </br> <label asp-for="IsDG"></label> <input asp-for="IsDG" /> <span asp-validation-for="IsDG" class="text-danger"> </span> </br> </br> <div> <label for="Manipulacija">Manipulacija:</label> <input asp-for="Manipulacija" /> <span asp-validation-for="Manipulacija" class="text-danger"></span> </div> <div> <label for="DgHandling">DgHandling:</label> <input asp-for="DgHandling" /> <span asp-validation-for="DgHandling" class="text-danger"></span> </div> <div> <label for="PDV">PDV:</label> <input asp-for="PDV" /> <span asp-validation-for="PDV" class="text-danger"></span> </div> <button type="submit">Pošalji</button> </form> </div>
无JavaScript的可行方案
方案1:在主提交Action内部调用第二个方法的业务逻辑
HTTP协议规定一次请求只能对应一个控制器Action,无JS情况下无法触发两次独立请求。最直接的解决方式是在接收表单提交的[HttpPost] InsertMAWB方法中,完成自身数据保存逻辑后,直接调用IzracunTotalaPdv的业务逻辑,无需额外发起请求。
修改后的InsertMAWB方法示例:
[HttpPost] public IActionResult InsertMAWB(Shipment model) { if (ModelState.IsValid) { // 原有数据保存逻辑 _productContext.Shipments.Add(model); _productContext.SaveChanges(); // 直接调用PDV计算逻辑(复用Shipment类的UkupnoSPDV方法) decimal ukupnoSPDV = model.UkupnoSPDV(model.Manipulacija, model.DgHandling, model.PDV); // 通过TempData传递计算结果到后续视图 TempData["UkupnoSPDV"] = ukupnoSPDV; // 跳转到Manipulacija视图,可在该视图读取TempData展示结果 return RedirectToAction("Manipulacija"); } else { return View(model); } }
之后在Manipulacija.cshtml中可以读取TempData展示计算结果:
@if(TempData["UkupnoSPDV"] != null) { <p>Ukupno sa PDV-om: @TempData["UkupnoSPDV"]</p> }
方案2:合并两个方法的逻辑到同一个Action
如果两个方法的业务关联性强,可以直接将IzracunTotalaPdv的逻辑整合到InsertMAWB中,避免额外方法调用,让单个Action完成所有需要的操作,这也是无JS场景下最简洁的方式。
内容的提问来源于stack exchange,提问作者Sasa Dedic
相关产品推荐
相关产品推荐

