【问题标题】:Client side validation on part of the form部分表单的客户端验证
【发布时间】:2017-01-19 08:33:31
【问题描述】:

我目前正在开发一个使用 C# 和 Asp.Net MVC 开发的应用程序。我有一个分为两部分的表格。如果单击,则每个都有 3 个提交按钮,当然会执行客户端验证并抱怨是否需要一个或多个输入。

点击次数如下:

  1. 提交 - 验证不应该是表单的前半部分
  2. 保存 - 无需验证
  3. 临时添加 - 表单下半部分的验证

我的视图模型类看起来像

public class ViewModel
{
    public User User { get; set; } //used for first half of the form
    public Department Department { get; set; } //used for second half of the form
}

我的 POCO 课程看起来像

public class User
{
    public int Id { get; set; }

    [Required]
    public string Username { get; set; } 
    public DateTime Dob { get; set; }

    //more required properties
}

public class Department
{
    public int Id { get; set; }

    [Required]
    public string DepartmentName { get; set; }

    //more required properties
}

保存 上,如果我有 cancel 类,则单击它似乎可以工作并且没有完成验证。但是,我似乎可以弄清楚如何为其他两个按钮做到这一点。有没有办法或者我在这里完全偏离轨道。

【问题讨论】:

  • 您必须手动处理它。这种情况没有任何自动验证。
  • @KD 能否提供一个小例子。
  • 不清楚你想要实现什么。您是否只想根据第一部分的某些条件验证第二部分?你想在第二部分之前保存第一部分吗
  • 这可能会派上用场:stackoverflow.com/questions/15154309/…
  • 选项 1:当您依赖数据注释时,您应该禁用客户端验证并在服务器端处理这些点击。选项 2:单击每个按钮时,添加一个 JS 函数,该函数将首先从不需要的表单元素中删除所有验证属性,然后尝试提交表单。让我知道你喜欢哪种策略

标签: javascript c# jquery asp.net asp.net-mvc


【解决方案1】:

当您决定在评论中使用选项 2 时,这里是它的解决方案。

如果您有 3 个不同的按钮...

<button type="button" id="save" class="submit">Save</button>
<button type="button" id="submit" class="submit">Submit</button>
<button type="button" id="tempAdd" class="submit">Temporarily Add</button>

您必须添加一个功能并将其与以上所有按钮绑定。

$(function(){
 $("submit").click(function(){
   var ignoreValidationElements = [];
   if$(this).attr("id") == "save")
   {
     // add element ids which you want to exclude from validation
     ignoreValidationElements.push("FirstName"); 
     ignoreValidationElements.push("LastName");
   }
   else if$(this).attr("id") == "submit")
   {
     ignoreValidationElements.push("FirstName");
   }
   else if$(this).attr("id") == "tempAdd")
   {
     ignoreValidationElements.push("LastName");
   }

    // code to remove validation attributes
    for(i = 0; i < ignoreValidationElements.length;i++)
    {
       var element = $("#" + ignoreValidationElements[i]);
       // remove all validation related attributes from it
       var attributes = element[0].attributes;
       for(var j = 0; j <attributes.length; j++)
       { 
           if(attributes[j].name.indexOf("data-") >=0)
           {
               var attributItem = attributes[j];
               var attributeName = attributeItem.name;
               element.removeAttr(attributeName);

           }
       }

//submit the form
    }
  });

});

【讨论】:

  • 您可以根据需要增强此逻辑,但此解决方案将使您对我的 cmets 中提到的选项 2 有一个完整的了解
  • 谢谢你,这给了我一个好主意。但是我收到一条错误消息attributes[j].indexOf is not a function。也不应该在外部for 循环之外提交表单
  • 我已经修复了这个错误。谢谢你。很快,正如我提到的,表单不应该在循环之外提交吗?
  • 不,我在必填字段上仍然遇到同样的问题,如果未填写,我会收到错误
  • 你可以试试这个链接吗? stackoverflow.com/questions/2853416/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
相关资源
最近更新 更多