当前位置: 首页 > 面试题库 >

MVC4和IClientValidatable-服务器端验证的自动AJAX调用

熊锐进
2023-03-14
问题内容

我正在寻求在MVC4中实现自定义客户端验证。我目前使用标准属性(例如在我的模型中)

public class UploadedFiles
{
    [StringLength(255, ErrorMessage = "Path is too long.")]
    [Required(ErrorMessage = "Path cannot be empty.")]
    [ValidPath]
    public string SourceDirectory { get; set; }
}

因此,StringLength和Required都自动转换为某些JQuery客户端验证。当前,“有效路径”仅在服务器端起作用。始终需要在服务器端进行验证,因为只有服务器才能验证路径是否有效,而您不能在客户端进行此验证。

服务器端代码如下所示

public class ValidPathAttribute : ValidationAttribute, IClientValidatable
{
    public string SourceDirectory;

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        string path = value.ToString();
        string message = string.Empty;

        var fileSystemSupport = new FileSystemSupport(Settings, new WrappedFileSystem(new FileSystem()));

        if (fileSystemSupport.ValidateNetworkPath(path, out message))
        {
            return ValidationResult.Success;
        }

        return new ValidationResult(message);
    }
}

这很好。现在,我希望通过ajax调用,在“ IClientValidatable”和“
GetClientValidationRules”中进行操作。我写完书后

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule();
        rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName());
        rule.ValidationType = "validpath";
        yield return rule;
    }

我相信我现在必须编写一些自定义验证脚本代码,适配器(以标识所需的元数据)和验证规则本身(验证器,由rule.ValidationType引用)。

我认为我不需要编写适配器,我可以使用

addBool- 为“打开”或“关闭”的验证器规则创建适配器。该规则不需要其他参数

所以在UploadedFiles.js中,我现在有了

$.validator.unobtrusive.adapters.addBool("validpath", "required");

在我看来

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
    @Scripts.Render("~/Scripts/UploadedFiles.js")
}

相信 这足以挂钩所有内容,但现在我需要编写javascript验证程序。这些位于jQuery.validator对象中,可以与$
.validator.addMethod添加在一起。

由于以下几个原因,我在这里有些不满意:

1)这是正确的方法吗,如果我的验证工作在服务器端,那么这是ajax调用吗?然后,这将需要同步。

2)是否有jQuery元素可以重复使用?我希望我已经完成了工作服务器端工作,因此我可以启用某种魔术功能将客户端连接到它(就像标准验证一样)。

3)我希望它可以在各种自定义验证属性中重复使用。我该如何使它通用?

抱歉,如果我是从痣山上爬下来的。谢谢你的时间 :)

拉斯


问题答案:

MVC附带了RemoteAttribute它,它在内部对控制器方法进行ajax调用,该方法返回一个Json值,该值指示验证是成功还是失败

public JsonResult IsValid(string SourceDirectory)
{
  if (someCondition) //test if the value of SourceDirectory is valid
  {
    return Json(true, JsonRequestBehavior.AllowGet); // indicates its valid
  }
  else
  {
    return Json(false, JsonRequestBehavior.AllowGet); // indicates its not valid
    // or return Json("A custom error message that overrides the default message defined in the attribute");
  }
}

并用

[Remote("IsValid", "YourController", ErrorMessage = "The path is not valid")]
public string SourceDirectory { get; set; }

注意:RemoteAttribute仅适用于客户端(jquery非侵入式验证),您可能仍需要其他服务器端验证。

有关详细示例,请参阅如何:在ASP.NET MVC中实现远程验证。



 类似资料:
  • 问题内容: 我需要在服务器端(PHP)期间和AJAX调用中启动重新加载。我该怎么做呢。老实说,我认为它不受支持。 我当前的方法是使用PHP header()函数并将其捕获为来自AJAX调用的responseText,然后执行innerHTML添加。 但是,这在我的书中不是正确的重载,因为它不会启动onload函数。它似乎也是人为的,而不是“干净的”解决方案。 问题答案: 将命令/标志发送回您的Aj

  • 问题内容: 进行客户端或服务器端验证哪个更好? 在我们的情况下,我们正在使用 jQuery和MVC。 在我们的视图和控制器之间传递的JSON数据。 我所做的许多验证工作都是在用户输入数据时对其进行验证。例如,我使用该事件来防止文本框中的字母,设置最大字符数,并且该数字在一定范围内。 我想更好的问题是,与客户端相比,进行服务器端验证是否有任何好处? 真棒的答案大家。我们拥有的网站受到密码保护,并且用

  • 问题内容: 我试图了解如何执行以下操作: 声明表单的可接受方式是什么。我的理解是,您只需用HTML声明表单,并添加ng-model指令,如下所示: 要发送到服务器的内容。我可以将item对象作为JSON发送到服务器,然后对其进行解释。然后,我可以对对象执行验证。如果失败,则抛出JSON错误,然后发回确切的信息?有接受的方式吗?如何以一种很好的方式将验证错误从服务器推送到客户端? 我确实需要一个示例

  • 我试图了解如何做以下事情: 声明表单的公认方式是什么。我的理解是您只需用超文本标记语言声明表单,然后添加ng-model指令,如下所示: 发送到服务器的内容。我可以将item对象作为JSON发送到服务器,并对其进行解释。然后我可以对对象执行验证。如果失败,我抛出一个JSON错误,并返回具体内容?有没有公认的方法?如何以一种好的方式将验证错误从服务器推送到客户端? 我真的需要一个例子,但是Angul

  • 然后我尝试了ConstraintViolationException,但它也不起作用,原因还有一个(请参见下面的跟踪)。 我一定要捕获异常(ConstraintViolationException)而不是使用返回值吗? 20161114更新:我没主意了。我尝试在自己的源文件中复制ConstraintViolationImpl(hibernate-validator-4.1.0)并通过网络发送。由于