如何在jQuery对话框中验证ViewModel?

时间:2010-08-04 21:09:08

标签: jquery asp.net-mvc ajax validation jquery-ui-dialog

我的AddressEditViewModel有一堆标记为[Required(ErrorMessage="My Error Message Here")]和/或[DisplayName("etc")]的属性。 DisplayName属性起作用:

<%: 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;
        }
    }
}

即使address.RequiredField为null,ModelState.IsValid也会返回true。 SubmitChanges()抛出SqlException,因为它无法插入NULL值。我不了解如何使用ModelState,还是有其他方法来提供无效字段的反馈?我想在我的文本框周围设置一个红色边框,就像我在很多MVC教程中看到的模型验证一样,或者可以从ViewModel中显示我的ErrorMessage值。

另一个编辑

删除了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 个答案:

答案 0 :(得分:2)

我建议您使用jquery.form插件,如果模型状态良好则返回内容(“ok”),否则返回View(yourViewModel),在客户端看看响应是否正常关闭在对话框中你用响应填充它(这是html)

你可以看一下:http://surveymaster.codeplex.com/我在这个项目中用jquery.form做了很多ajax, 虽然我没有在ajax响应中使用返回html的东西因为没有必要