У меня возникают проблемы с эстетикой и согласованностью, когда дело доходит до ошибок проверки на стороне клиента в определенном представлении. Представление состоит из нескольких (дочерних) частичных представлений и в основном представляет собой форму, использующую Html.Textbox()
и Html.TextBoxFor()
MVC/Razor во многих местах. В некоторых частичных представлениях мне нужно, чтобы входные данные не были строго типизированы, следовательно, только TextBox()
, и в этих случаях проверка не будет запускать стилизацию полей ввода на стороне клиента.
Я знаю, что ModelState недействителен, и Html.ValidationSummary()
показывает правильные сообщения об ошибках из ошибок проверки, вызванных как TextBox()
, так и TextBoxFor()
. Однако только TextBoxFor()
получает класс: "input-validation-error"
Вопрос: Как включить красный индикатор TextBox()
при возникновении ошибки? (Проще говоря). Я полагаю, что отсутствует значение или атрибут, по которому срабатывает проверка JQuery.
Код:
Работы: @Html.TextBoxFor(x => x.Owner, new { @class = "form-control" })
Не: @Html.TextBox(name, Model.Name, new { @class = "form-control" })
Вывод в формате HTML
Работы: <input class="input-validation-error form-control" data-val="true" data-val-required="Input is required." id="Owner" name="Owner" type="text" value="">
Не: <input class="form-control" id="Applicants_1__Name" name="Applicants[1].Name" type="text" value="">
data-val-*
добавляются помощниками html путем чтенияModelMetadata
свойства. Поскольку значениеname
не является свойством вашей модели, читать нечего, поэтому они не будут добавлены! Используйте хелперы строгого типа (и если вы думаете, что не можете, значит, вы делаете это неправильно) - person   schedule 06.02.2015TextBox()
? Из любопытства, как будет выглядеть эквивалентTextBoxFor()
в моем (см. выше) случае? - person skepnaden   schedule 06.02.2015@Html.TextBoxFor(m => m.Name)
, но я подозреваю, что это не настоящая проблема, поскольку похоже, что у вас есть коллекция, в этом случае этоfor(int i = 0; i < Model.Applicants.Count; i++) { @Html.TextBoxFor(m => m.Applicants[i].Name) @Html.ValidationMessageFor(m => m.Applicants[i].Name) }
. И вы не можете использовать партиал для рендеринга коллекции (по крайней мере, без дополнительных надстроек) — используйте пользовательскийEditorTemplate
вместоApplicants
, если вы не хотите использовать циклfor
. - person   schedule 07.02.2015