У моего AddressEditViewModel есть куча атрибутов с пометкой [Required(ErrorMessage="My Error Message Here")]
и/или [DisplayName("etc")]
. Отображаемое_имя атрибуты работы:Как я могу проверить ViewModel в диалоговом окне jQuery?
<%: Html.LabelFor(model => model.Field) %>
, и я думаю, что обязательные атрибуты работают, но я не знаю, как обеспечить обратную связь по форме (JQuery UI Dialog). Эта форма передается через $ .ajax(), и в способе действия:
[HttpPost]
public ActionResult Edit(AddressEditViewModel address)
{
var addressToEdit = dc.Addresses.FirstOrDefault(x => x.AddressID == address.AddressIDEdit);
if (ModelState.IsValid)
{
//make sure there is at least one active address
if (!address.ActiveEdit && (addressToEdit != null && addressToEdit.Active))
{
if (dc.Addresses.Where(x => x.ProfileID == addressToEdit.ProfileID).Count(x => x.Active) == 1)
{
address.ActiveEdit = true;
}
}
try
{
//TryUpdateModel SUCKS!~
//use valueinjecter
addressToEdit.InjectFrom<VMToAddress>(address);
dc.SubmitChanges();
}
catch (Exception)
{
return View(address);
}
}
else
{
return View(address); //activate the red borders around textboxes
}
return Content("Ok");
}
И маленький класс для ValueInjecter:
public class VMToAddress : LoopValueInjection
{
protected override string TargetPropName(string sourcePropName)
{
if (sourcePropName.EndsWith("Edit"))
{
return sourcePropName.RemoveSuffix("Edit");
}
else if (sourcePropName.EndsWith("Create"))
{
return sourcePropName.RemoveSuffix("Create");
}
else
{
return sourcePropName;
}
}
}
ModelState.IsValid возвращает истину, даже если address.RequiredField
равно нулю. SubmitChanges()
генерирует исключение SqlException, поскольку оно не может вставить значение NULL. Разве я не понимаю, как использовать ModelState, или есть ли другой способ обеспечить обратную связь в недопустимом поле? Я хотел бы установить красную рамку вокруг своих текстовых полей, такую как валидация модели, которую я видел во многих обучающих программах MVC, или, может быть, отобразить мое значение ErrorMessage из ViewModel.
Другой Редактировать
Удалены jQuery.validate и создал модель клиент связующее для размещения обычно названных элементов. Пользовательское связывание модели теперь даже добавляет сообщения проверки (поэтому я удалил Html.ValidationMessageFor(...)
звонки, так как я не хочу их - только границы).
Тем не менее, по предложению Omu использовать плагин jQuery.form, моя модель, кажется, потеряна после первой обратной передачи. closeEditForm
просто проверяет возврат Content("Ok")
, закрывает диалоговое окно «Редактировать» и, наконец, обновляет диалоговое окно «Список». Но после ошибки он корректно не закрывает диалоговое окно, дает мне красные границы (ура), но на последующих постах есть . Никакая модель (boo) не передана моему связующему - всего лишь нулевые значения.
$('#editform').submit(function() {
$(this).ajaxSubmit({
target: '#editform', //this will allow validation classes to be added, etc
success: closeEditForm //this will close the edit form if the response text is "Ok"
});
return false;
});
я отправить форму, как это:
$("#dialog-address-edit").dialog({
...lots of dialog settings
buttons: {
'Save': function() {
$('#editform').submit();
Вы отлично проверяете свой ModelState, но можете ли вы проверить отладчик, что находится в адресном объекте (внутри вашего действия)? у вас могут возникнуть проблемы с сериализацией/публикацией AJAX. Кроме того, он работает, если вы используете «классический» POST (без jQuery)? – mare
Я не сериализую (пока), в настоящее время мой вызов $ .ajax() использует 'data:" addressid = "+ $ ('# AddressID-Edit'). Val() + ...' so 'address' содержит нулевое поле, которое я ожидал, и 'addressToEdit' содержит исходные значения. Я не думаю, что это будет работать с регулярным POST, так как мой идентификатор поля - это имя поля ** - Edit **. Разве это не потребует какого-то дополнительного картографирования? –
, когда вы получаете ошибки проверки, и html отправляется обратно в браузер, вы устанавливаете его в div, и вам нужно снова регистрировать все, $ (editform) .submit(), проверять, .. все, что у вас есть – Omu