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

.NET中如何通过FormHelper为特定提交按钮禁用FluentValidation

实现单个提交按钮启用FormHelper+FluentValidation验证

问题场景

使用FluentValidation配合FormHelper实现AJAX表单验证,表单包含两个提交按钮:

  • 按钮1:触发验证并提交到带[FormValidator]注解的Save方法
  • 按钮2:跳过验证,提交到无验证注解的AnotherAction方法

当前问题:两个按钮均会触发Save方法的验证逻辑;移除asp-formhelper="true"后,按钮能正确调用对应方法,但丢失FormHelper的AJAX验证功能。


解决方案

方法一:利用FormHelper忽略属性+手动AJAX提交

通过给第二个按钮添加忽略标识,跳过FormHelper的拦截,手动发起AJAX请求:

  1. 给第二个按钮添加formnovalidate(禁用HTML5原生验证)和data-formhelper-ignore="true"(让FormHelper不处理此按钮的提交)
  2. 编写JS监听按钮点击,手动收集表单数据并提交到目标Action

修改后的视图代码:

<form id="myFrom" asp-controller="MyController" asp-action="Save" method="post" asp-formhelper="true">
    <label asp-for="MyField" class="form-label">My field: </label>
    <input asp-for="MyField" class="form-control"/>
    <span asp-validation-for="MyField" class="text-danger"></span>               
    
    <input type="submit" value="POST with validation">      
    <input type="submit" id="btnNoValidation" formnovalidate data-formhelper-ignore="true" value="Post without validation">
</form>

<script>
document.getElementById('btnNoValidation').addEventListener('click', function(e) {
    e.preventDefault();
    
    // 收集表单数据
    const formData = new FormData(document.getElementById('myFrom'));
    // 获取防跨站请求伪造令牌
    const token = document.querySelector('input[name="__RequestVerificationToken"]').value;
    
    // 发起AJAX请求到AnotherAction
    fetch('/MyController/AnotherAction', {
        method: 'POST',
        body: formData,
        headers: {
            'RequestVerificationToken': token
        }
    })
    .then(res => res.json())
    .then(data => {
        // 根据业务需求处理返回结果,比如更新页面、提示信息等
        console.log(data);
    })
    .catch(err => console.error('提交失败:', err));
});
</script>

方法二:利用ASP.NET Core Action路由机制

通过给按钮设置name="action"和对应Action名称的value,让框架自动路由到目标方法,同时用formnovalidate跳过验证:

修改后的视图代码:

<form id="myFrom" asp-controller="MyController" method="post" asp-formhelper="true">
    <label asp-for="MyField" class="form-label">My field: </label>
    <input asp-for="MyField" class="form-control"/>
    <span asp-validation-for="MyField" class="text-danger"></span>               
    
    <input type="submit" name="action" value="Save" />      
    <input type="submit" name="action" value="AnotherAction" formnovalidate />
</form>

控制器代码保持原结构不变:

public class MyController
{
    [HttpPost, FormValidator]
    public async Task<IActionResult> Save(MyViewModel vm)
    {        
        // 业务逻辑
    }

    [HttpPost]
    public async Task<IActionResult> AnotherAction(MyViewModel vm)
    {
        // 其他业务逻辑
    }
}

逻辑说明:

  • 点击第一个按钮时,FormHelper会触发验证流程,ASP.NET Core根据action=Save路由到带[FormValidator]的方法,执行验证。
  • 点击第二个按钮时,formnovalidate跳过原生验证,FormHelper会路由到AnotherAction方法,该方法无[FormValidator]注解,因此不会触发FluentValidation验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:25:35