Когда `HttpGet` обрабатывает метод действия` Create` просто возвращает `View ()`, почему проверка JavaScript не запускается в браузере? - PullRequest
3 голосов
/ 21 декабря 2010

Когда HttpGet обработка Create метод действия просто возвращает View(), он вызывает инициализацию всех полей формы.

Почему проверка JavaScript не запускается, когда пользователи просматривают пустую форму?

Ответы [ 4 ]

3 голосов
/ 24 марта 2011

Я действительно не знаю внутреннюю работу, но я дам это предположение; -)

Прежде всего, он не имеет ничего общего с тем, является ли он [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 и т. Д.

2 голосов
/ 24 марта 2011

Процедуры проверки формы будут выполняться только в том случае, если ModelState недопустим, а затем помощники ValidationMessageFor используют коллекцию ModelState.Errors, чтобы определить, является ли их поле в модели недействительным.

Таким образом, если вы возвращаете представление без данных модели и, следовательно, без состояния модели, нет ошибок для запуска проверки.

1 голос
/ 21 декабря 2010

В Rails ответ таков: валидации вызываются только при сохранении.Я думаю, что ответ здесь такой же или похожий.

0 голосов
/ 30 марта 2011

Включили ли вы Правильно ли включена проверка клиента?

@{ Html.EnableClientValidation(); }

или используя конфигурацию

<appSettings>
  <add key="ClientValidationEnabled" value="true" />
  <add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>

Проверка Javascript подключается к событию отправки для формы. Загрузка пустой формы не запускает это событие в браузере пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...