【问题标题】:Razor does not trigger named handler if property has [Required] annotaion如果属性具有 [Required] 注释,则 Razor 不会触发命名处理程序
【发布时间】:2020-11-24 01:36:38
【问题描述】:

我有一个简单的表单,带有一些后期处理程序。我只想在输入不为空时提交表单。

<form method="post">
    <input asp-for="Feedback" />
    <button type="submit" asp-page-handler="Test">Submit</button>
</form>
public void OnPost() {}

public void OnPostTest() {}

当我在Feedback 属性上没有[Required] 注释时,当我单击提交按钮时,它会正确触发OnPostTest() 方法。但我确实想要所需的验证。

public string Feedback { get; set; }

但是,当我添加[Required] 注释时,当我单击提交按钮时,它总是会触发OnPost() 方法。但是我想触发OnPostTest()方法。

[Required]
public string Feedback { get; set; }

我认为asp-page-handler 很简单,我错过了什么?

我正在使用 .NET Core 3.1

【问题讨论】:

  • 这听起来不对……也许还有其他事情发生。应该调用OnPostTest,只需使用ModelState.IsValid == false
  • @JeremyLakeman 感谢您的确认。我发现罪魁祸首在一个扩展 js 文件中,我们在其中使用了来自 jQuery Validation 的submitHandler。我会将其添加到我自己的答案中。

标签: c# asp.net-core razor razor-pages unobtrusive-validation


【解决方案1】:

我在一个扩展 JavaScript 文件中找到了罪魁祸首,我们在其中使用了来自 jQuery Validation 的 submitHandler

submitHandler: function(form) {
    form.submit();
}

单步执行这段代码,我发现form.action 没有处理程序,例如"https://localhost:44352/TestPage"。所以按钮上的formaction 没有 overrides the action attribute of the button's form owner,这是我没想到的。

无论如何,event.submitter.formAction 中确实有处理程序,例如"https://localhost:44352/TestPage?handler=Test",所以我通过将其分配给表单操作来修复它。

submitHandler: function(form) {
    if ((event.submitter && event.submitter.formAction 
         && form.action !== event.submitter.formAction) {
        form.action = event.submitter.formAction;
    }
    form.submit();
}

【讨论】:

  • 由于不显眼的验证,通常 ASP 用户无法调用 .validate(),因此他们通过 jQuery Validate 的 .setDefaults() 方法覆盖插件选项。
猜你喜欢
  • 1970-01-01
  • 2015-03-30
  • 2019-05-05
  • 2014-01-08
  • 1970-01-01
  • 2014-06-03
  • 2021-02-07
  • 1970-01-01
  • 2016-06-30
相关资源
最近更新 更多