Razor не запускает именованный обработчик, если свойство имеет аннотацию [Обязательно].

У меня простая форма с некоторыми обработчиками сообщений. Я хочу отправить форму только тогда, когда ввод не пуст.

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

public void OnPostTest() {}

когда у меня нет аннотации [Required] к свойству Feedback, он правильно запускает метод OnPostTest(), когда я нажимаю кнопку отправки. Но мне нужна необходимая проверка.

public string Feedback { get; set; }

однако, когда я добавляю аннотацию [Required], она всегда запускает метод OnPost(), когда я нажимаю кнопку отправки. Но я хочу запустить метод OnPostTest().

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

Я думал, что asp-page-handler просто, что мне не хватает?

Я использую .NET Core 3.1


person Hank Huang    schedule 04.08.2020    source источник
comment
Звучит неправильно ... может, что-то еще происходит. OnPostTest должен вызываться, только с ModelState.IsValid == false.   -  person Jeremy Lakeman    schedule 04.08.2020
comment
@JeremyLakeman Спасибо, что подтвердили это. Я считаю, что виноват в js-файле расширения, где мы использовали submitHandler из jQuery Validation. Я добавлю это к своему собственному ответу.   -  person Hank Huang    schedule 04.08.2020


Ответы (1)


Я нахожу виноватых в расширении файла JavaScript, в котором мы использовали submitHandler из jQuery Validation:

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

Проходя через этот код, я обнаружил, что form.action не имеет обработчика, например. "https://localhost:44352/TestPage". Таким образом, formaction на кнопке не переопределяет атрибут action владельца формы кнопки, чего я не ожидал.

В любом случае, в 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();
}
person Hank Huang    schedule 04.08.2020
comment
Обычно пользователи ASP не могут вызвать .validate() благодаря ненавязчивой проверке, поэтому они переопределяют параметры плагина с помощью .setDefaults() метода jQuery Validate. - person Sparky; 08.08.2020