ASP NET MVC:在表单上动态添加或删除输入 - 不显眼的验证

时间:2011-02-04 11:29:30

标签: asp.net-mvc asp.net-mvc-3 validation unobtrusive-javascript

在开始之前,我确实有一个非常特别的问题,如果你想回答它,请直接进行。但我确实欢迎评论和建议,因此这篇文章篇幅很长。

好的,我们处理了很多表单,其中一些形式很长,而且有很多字段。除了顶级字段之外,我们还有一个要求是能够拥有可变数量的重复行 - 正如我们所说的那样。例如,让我们考虑一个名字,姓氏和年龄的客户,虽然它可以有零个或多个地址(例如0到10),因此用户必须能够在填写表格时添加或删除表单中的联系人。所以通常用户获取“添加”按钮以添加更多地址,并在每个地址旁边添加一个删除按钮。可能会有不止一个重复部分以相同的形式,但我不会去那里。关键是,由于法律和历史原因,所有表格必须一次保存,所以在表格可以编辑时,我们不能接受半满的表格,并有另一页供用户添加和删除地址,例如

我正在使用ASP NET MVC 2(具有单个通用控制器的强类型视图),具有客户端验证和用于浮华功能的大量jquery脚本。我们很可能很快就会迁移到ASP NET MVC 3,我已经在寻找一个好的解决方案了。这些地址在模型上定义为List<Address>,例如

我目前有一个解决此问题的工作解决方案,但我对此不满意:我有一个HTML Helper,它命名添加或删除按钮和一些JavaScript来禁用验证并允许将表单发回(甚至因为我可以找到被点击的按钮的名称,所以我有所有必要的逻辑来处理添加或删除并且工作得非常好。

但是我回帖并重新加载了表单,我正在寻找一个优秀的解决方案。以下是我可以做的事情:

  • 在客户端做一切。 “添加”按钮将克隆其中一个此类地址,“删除”按钮将remove()元素。我只需要重命名我所做的索引。我们正在使用jquery日历,它打破了我已经修复的新元素。但验证不起作用,可能与ASP NET MVC一起使用,但这个解决方案看起来非常脆弱 - 在添加另一张卡之前看起来很棒的卡片之家。
  • 使用Ajax发布整个页面,然后再次加载:这可能比我目前的解决方案更好但只是略微。
  • 使用ajax发布表单并获取JSON并使用数据构建元素或删除它们:由于广泛的客户端脚本,再次成为卡片之家
  • 序列化表单并使用Ajax发布到特定操作并仅返回重复部分(作为部分视图)。控制器上的操作可以重复使用,并从视图本身调用以返回部分视图

    确定最后一个是我正在处理的那个但是有一个问题。具有不引人注意的验证的ASP NET MVC 3仅在表单被BeginForm()吞没而我的顶级视图具有BeginForm()但不是我的部分视图时才有效。当我从视图中调用它而不是在ajax调用上调用它时,它可以很好地获取重复部分。

(问题)

那么有没有办法告诉ASP NET MVC 3吐出验证数据atttributes而不管在BeginForm()块中?说实话,如果这不是一个错误,这绝对是一个重要的功能请求。我实际上使用反射器来反汇编代码,条件似乎就在那里。

2 个答案:

答案 0 :(得分:2)

简答:

将其添加到局部视图中:

if (ViewContext.FormContext == null)
{ 
    ViewContext.FormContext = new FormContext();
}

答案 1 :(得分:1)

我认为使用默认的不显眼的库是不可能的。如果你看一下jquery.validate.js和jquery.validate.unobtrusive.js,看起来它只会验证表单里面的内容。

如果谷歌搜索和一些解决方法,有一些关于它的帖子。

我有一个类似的问题(虽然简单得多)我在页面顶部有一个验证摘要和多个表单,但不显眼的javascript只会填充视图摘要,如果它在表单内部(jquery.validate.unobtrusive)。 js第39行如果有兴趣......)。

我不确定验证库是否可扩展,但jquery中的大多数内容都是如此,如果你想沿着这条路走下去可能是一个选择。

至于你问题的一个可能的解决方案,我会花2美分买它的价值。

您可以将两个操作发布到。第一个动作是你发布你的模型没有js验证,所有验证都在代码中处理 - 这将捕获关闭javascript的所有用户。

您的第二个操作是序列化模型。在使用Ajax.BeginForm的mvc 3中,有一个用于Url的AjaxOption,您可以在其中指定要调用的jquery的操作(它将表单序列化为您,您可以使用强类型模型来装饰您的操作)。在这里,您可以检查模型并返回json结果并在javascript中处理。