Потому что, когда вы вызываете Html.BeginForm
, он устанавливает переменную контекста формы, что приводит к тому, что такие помощники, как TextBoxFor, CheckBoxFor, ... испускают атрибуты data- * HTML5 при создании соответствующих им полей ввода. Попробуйте, например, использовать один из этих помощников без формы, и вы увидите, что входные данные не имеют никаких атрибутов данных data- * HTML5, которые используются при проверке на стороне клиента.
Вы можете обмануть, вручную создав контекст формы:
@{ViewContext.FormContext = new FormContext();}
<form ....>
@Html.EditorFor(x => x.Foo)
<button type="submit">OK</button>
</form>
Но эй, зачем вам нужно вручную жестко закодировать форму вместо использования соответствующих помощников, которые позаботятся о правильной генерации URL, методов, кодирования, ...?