Нет атрибутов data-val* с частичным представлением
У меня есть представление с Html.BeginForm(), которое вызывает частичное представление (упомянуто ниже и не имеет формы), передавая в основной модели представления. Модель имеет аннотацию данных.
При первоначальной загрузке страницы проверка работает отлично, если я пытаюсь отправить без выбора правильных значений.
У меня также есть другая кнопка на странице, которая при нажатии загружает другой экземпляр того же частичного представления на странице, используя сообщение $.ajax() в Controller, которое возвращает только PartialView, и добавляет его к существующему div.
Если я сейчас попытаюсь отправить форму этим динамическим элементам управления, хотя они привязаны к одной и той же модели, и хотя я установил правильные помощники.ValidationMessageFor, проверка для них не появится, так как элементы управления не создаются с помощью data-val. * атрибуты.
я использовал fiddler и обнаружил, что $.ajax, отправляемый в контроллер, генерирует частичное представление с простым и без ValidationMessage, где также генерируется. Он не может использовать ненавязчивый JavaScript для динамических элементов управления, которые были добавлены.
Нужно ли всегда иметь представление внутри формы? В таком случае у меня будут вложенные формы, и это не сработает.
РЕДАКТИРОВАТЬ 1: Как упоминалось Адамом Тулипером в вопросе ViewContext.FormContext = new FormContext сгенерировал частичное представление со всеми атрибутами data-val*. Следовательно, отвечает на мой вопрос выше. Теперь проверка динамического содержимого не выполнялась. как и в случае с Эриком (в разделе "Комментарии"), я удалил валидатор формы [form.removeData("валидатор");], а затем он также начал проверять динамический контент.
Ниже приведен частичный вид
<div id="divVehicleInfo">
<fieldset>
<legend>Vehicle Information</legend>
@for (var i = 0; i < Model.QuoteInput.Vehicle.Count(); i++)
{
<div class="editor-label">
@Html.LabelFor(model => model.Vehicle[i].VehicleMake)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Vehicle[i].VehicleMake)
@Html.ValidationMessageFor(model => model.Vehicle[i].VehicleMake)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Vehicle[i].VehicleModel)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Vehicle[i].VehicleModel)
@Html.ValidationMessageFor(model => model.Vehicle[i].VehicleModel)
</div>
}
</fieldset>
</div>
И это модель для частичного взгляда
public class Vehicle
{
public int VehicleID { get; set; }
[Required]
[DisplayName("Vehicle Make")]
public string VehicleMake { get; set; }
[Required]
[DisplayName("Vehicle Model")]
public string VehicleModel { get; set; }
}
2 ответа
Вам необходимо включить ненавязчивый сценарий проверки в частичном представлении.
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
Частичное представление не наследует сценарии страницы, на которой оно размещено, если только они не будут выполнены снова после обновления домена.
Как упомянуто Адамом Тулипером в вопросе ViewContext.FormContext = new FormContext
генерирует частичное представление со всеми атрибутами data-val*. Следовательно, отвечает на мой вопрос выше. Теперь проверка динамического содержимого не выполнялась. так как в соответствии с Erick (в разделе комментариев), я удалил валидатор формы [form.removeData(‘validator’);
], а затем он начал проверять динамический контент.