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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:05:53