【问题标题】:How can I validate a ViewModel in jQuery Dialog?如何在 jQuery 对话框中验证 ViewModel?
【发布时间】:2011-03-25 12:03:27
【问题描述】:

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

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

,我认为Required 属性也可以,但我不知道如何在表单上提供反馈(jQuery UI 对话框)。这个表单是通过 $.ajax() 提交的,在 action 方法中:

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

另一个编辑

删除了 jQuery.validate 并创建了一个客户模型绑定器来容纳常用命名的元素。自定义模型绑定器现在甚至添加了验证消息(所以我删除了 Html.ValidationMessageFor(...) 调用,因为我不想要它们——只是边框)。

但是,在 Omu 建议使用 jQuery.form 插件时,我的模型在第一次回发后似乎丢失了。 closeEditForm 只检查Content("Ok") 的返回,关闭编辑对话框,最后刷新列表对话框。但是,发生错误后,它没有正确关闭对话框,给我红色边框(万岁),但在随后的帖子中,没有模型(嘘)传递给我的活页夹——只有空值。

$('#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),它是否有效?
  • 我还没有序列化,目前我的 $.ajax() 调用使用data: "addressid=" + $('#AddressID-Edit').val() +... 所以address 包含我期望的空字段,addressToEdit 包含原始值。我认为它不适用于常规 POST,因为我的字段 ID 是字段名**-Edit**。这不需要某种额外的映射吗?
  • 当您收到验证错误并将 html 发送回浏览器时,您将其设置到 div 中,并且您必须再次注册所有内容,$(editform).submit() ,验证, .. 里面的任何东西
  • 我发布了我的整个控制器更新方法。我以为“再次注册所有内容”是由return PartialView("Edit", address);完成的???不是吗?当我在 Firebug 中检查元素时,它看起来确实像在第一个表单中插入了另一个 &lt;form id="editform"...&gt; - 为什么会发生这种情况?我不明白你重新注册所有内容是什么意思。
  • 复制表单是因为我的.ajaxSubmit 目标是表单本身。我通过在表单周围添加一个包装器 div 并将目标更改为所述包装器来解决此问题。我的模型仍未通过调用 TryUpdateModel 进行更新。

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


【解决方案1】:

我建议您使用 jquery.form 插件,如果模型状态良好,则在操作中返回 Content("ok"),否则返回 View(yourViewModel),在客户端查看响应是否正常,则关闭否则您将使用响应(即 html)填充它的对话框

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

【讨论】:

  • 我认为我使用 jQuery.validate 可以正常工作,但我的问题是 ModelState.IsValid always 似乎是正确的——不管输入是否无效。我不认为 ModelState 与我的模型有关。等等...我正在使用AddressEditViewModel 渲染编辑视图,并且更新操作接受Address——这是对的吗?
  • 好的,我想我现在,你有Update(Address address),但你应该有Update(AddressViewModel address)
  • 当我使用AddressEditViewModel 时,帖子不会在AddressID-Edit 的id 的表单中拾取隐藏字段。查看我对发布到 /Address/Update 的 jQuery 的编辑
  • 当您使用视图模型时,html 中的每个输入都应该在视图模型中具有一个属性,并且应该可以工作
  • 尝试将AddressEditViewModel 作为操作参数传递——不会绑定。尝试为我的场景创建自定义模型绑定器,但它仍然无法绑定。其他帖子推荐在我的视图模型中使用无参数构造函数。但是,在编辑操作(不是帖子)中返回的 AddressEditViewModel 不会绑定到任何内容,因此编辑字段都是空白的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
相关资源
最近更新 更多