Как я могу проверить ViewModel в диалоге jQuery? - PullRequest
2 голосов
/ 05 августа 2010

Мой AddressEditViewModel имеет несколько атрибутов, помеченных [Required(ErrorMessage="My Error Message Here")] и / или [DisplayName("etc")].Атрибуты DisplayName работают:

<%: Html.LabelFor(model => model.Field) %>

, и я думаю, что обязательные атрибуты тоже работают, но я не знаю, как предоставить отзыв о форме (диалоговое окно jQuery UI).Эта форма отправляется через $ .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 возвращает true, даже если 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();

1 Ответ

2 голосов
/ 06 августа 2010

Я бы порекомендовал вам использовать плагин jquery.form и в действии, если состояние модели хорошее, вы возвращаете Content ("ok"), в противном случае вы возвращаете View (yourViewModel), на клиенте, который вы смотрите, если ответ в порядке, вы закрываете диалоговое окно, в противном случае вы заполняете его ответом (HTML)

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

...