Я действительно не знаю внутреннюю работу, но я дам это предположение; -)
Прежде всего, он не имеет ничего общего с тем, является ли он [HttpGet]
или [HttpPost]
- так оно и обычно работает.
Ваши средние [HttpGet]
методы выглядят примерно так:
[HttpGet]
public ActionResult Index() {
// Get some data from the database
return View(data);
}
В этом методе нет никаких параметров, потому что мы хотим, чтобы пользователь нажимал на этот контроллер, когда он просто вводит URL (т.е. Home/Index
).
Ваш обычный [HttpPost]
метод может выглядеть следующим образом:
[HttpPost]
public ActionResult Create(MyModel myModel) {
if (ModelState.IsValid)
{
// Do stuff
}
else
{
return View(myModel);
}
}
Я считаю, что атрибуты проверки не срабатывают до тех пор, пока вы на самом деле не свяжете значения формы с моделью и не нажмете этот контроллер Create (...). Если ваш [HttpGet]
получит модель в качестве параметра, тогда проверка также будет запущена в этой точке.
Когда вы возвращаете представление с существующей, недействительной моделью, каким-то образом метод ValidationMessageFor(m => m.SomeProperty)
знает, что проверка этого свойства завершилась неудачно. В этой части я не уверен.
Напротив, когда вы возвращаете новый View()
в качестве ActionResult (как вы обычно делаете для HTTP GET), создается совершенно новая блестящая модель. Создать новую модель так же просто, как создать POCO (Plain Old C # Object) - проверка не запускается.
Что касается проверки на стороне клиента, то она полностью обрабатывается через JavaScript, как только вы нажимаете кнопку отправки формы. Когда ваш запрос [HttpGet]
отображает пустую форму, кнопка отправки еще не была нажата (поэтому проверка JavaScript не была запущена). Кроме того, я полагаю, что как только вы начнете печатать, проверка также активируется через различные события JavaScript, такие как change
, keydown
, keypress
и т. Д.