2010-08-04 3 views
2

У моего 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(); 
+0

Вы отлично проверяете свой ModelState, но можете ли вы проверить отладчик, что находится в адресном объекте (внутри вашего действия)? у вас могут возникнуть проблемы с сериализацией/публикацией AJAX. Кроме того, он работает, если вы используете «классический» POST (без jQuery)? – mare

+0

Я не сериализую (пока), в настоящее время мой вызов $ .ajax() использует 'data:" addressid = "+ $ ('# AddressID-Edit'). Val() + ...' so 'address' содержит нулевое поле, которое я ожидал, и 'addressToEdit' содержит исходные значения. Я не думаю, что это будет работать с регулярным POST, так как мой идентификатор поля - это имя поля ** - Edit **. Разве это не потребует какого-то дополнительного картографирования? –

+0

, когда вы получаете ошибки проверки, и html отправляется обратно в браузер, вы устанавливаете его в div, и вам нужно снова регистрировать все, $ (editform) .submit(), проверять, .. все, что у вас есть – Omu

ответ

2

Я бы порекомендовал вам использовать jquery.form плагин и в действии, если ModelState хорошо вы возвращаетесь содержание («ОК»), иначе вас return view (yourViewModel), на клиенте, который вы смотрите, если ответ в порядке, вы закрываете диалог, иначе вы заполняете его ответом (который является html).

Вы можете посмотреть здесь: http://surveymaster.codeplex.com/ Я сделал много ajax с jquery .form в этом проекте, , хотя я не использовал вещь с возвратом html в ответ ajax, потому что там не было необходимости

+0

Я думаю, что я работаю с помощью jQuery.validate, но моя проблема в том, что ModelState.IsValid ** всегда ** Кажется, что это правда - независимо от недопустимого ввода.Я не думаю, что ModelState связан с моей моделью. Подождите ... Я визуализирую Edit View с помощью 'AddressEditViewModel', и действие Update принимает' Address'- -это это право? –

+0

нормально, я думаю, что теперь у вас есть «Update (Address address)», но вы должны иметь «Update (AddressViewModel address)» вместо – Omu

+0

Когда я использую 'AddressEditViewModel', сообщение не подбираетскрытое поле в форме по идентификатору 'AddressID-Edit'. См. Мое редактирование для jQuery, которое отправляет в/Address/Update –

Смежные вопросы