【问题标题】:ASP .NET MVC 3 - RemoteAttribute override IsValid, access to the additional fieldsASP .NET MVC 3 - RemoteAttribute 覆盖 IsValid,访问附加字段
【发布时间】:2011-08-30 08:16:57
【问题描述】:

伙计们,我正在创建一个继承自 System.Web.Mvc.RemoteAttribute 的新属性。我想重写 IsValid 方法,因为验证在没有启用 JavaScript 的情况下也可以工作。但我不知道如何访问其他字段。我的代码是:

[AttributeUsage(AttributeTargets.Property)]
public class DocumentationAttribute : System.Web.Mvc.RemoteAttribute
{
    public DocumentationAttribute()
        : base("ValidPass", "Validation")
    {
        base.HttpMethod = "Post";
    }
    private DocumentationAttribute(string routeName)
        : base(routeName)
    {

    }
    private DocumentationAttribute(string action, string controller)
        : base(action, controller)
    {

    }
    private DocumentationAttribute(string action, string controller, string areaName)
        : base(action, controller, areaName)
    {

    }

    public override bool IsValid(object value)
    {
        //How can i access to the additional fields?
    }}

类模型:

        [Display(Name = "Passport")]
        [Documentation(ErrorMessage = "{0} not valid", AdditionalFields = "IDPass")]
        public virtual String Passport
        {
            set;
            get;
        }

【问题讨论】:

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


    【解决方案1】:

    如果没有 javascript,您将无法进行远程验证。这就是它的工作原理。您不妨只依赖服务器端验证,因为这是唯一一种无需 javascript 即可工作的验证。

    您是否正在尝试创建一个使用 javascript 远程工作的验证器,但如果 javascript 被禁用,服务器端是否有效?如果是这样,那么您应该创建一个从 ValidationAttribute 派生的自定义属性,并使用 remote。

    特别针对您的问题,您需要在名为 AdditionalFields 的属性中创建一个公共属性,当您声明该属性时,该属性会在初始化程序中设置,然后您可以从 IsValid 访问该属性。

    编辑:

    根据您的其他信息,您需要使用 IsValid 的第二种形式,该形式采用验证上下文。你会做这样的事情:

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var fields = validationContext.ObjectType.GetProperty(this.AdditionalFields);
        var fieldsValue = (string)fields.GetValue(validationContext.ObjectInstance, null);
    }
    

    【讨论】:

    • 感谢您的回复。我是新手,所以我不知道这是最好的选择。我的应用程序必须是可访问的,并且我想验证用户的 ID 号。我在库 c# 中有用于此验证的函数。我想实现两种验证:客户端或服务器。那么,我是否选择了使用 remoteattribute 进行验证的最佳选项?我不明白你关于创建从 ValidationAttribute 派生的自定义属性并使用远程的意思......你很高兴发送示例代码吗?
    • 关于remoteattribute,我试过你的解决方案,但我只能得到字段的名称,而不能得到值。我的模型有一个实体 POCO,其中包含元数据和信息以及一些 SelectList 对象。所以我需要在调用远程验证的控制器操作中使用前缀。我希望你能理解我 :) 谢谢!
    • [HttpPost] public ActionResult ValidPass([Bind(Prefix = "Solicitud.DocIdentidad")] string DocIdentidad, [Bind(Prefix = "Solicitud.IdTipoDocIdentidad")] int? IdTipoDocIdentidad) { if (string.IsNullOrEmpty(DocIdentidad) || !IdTipoDocIdentidad.HasValue) { return Json(false); } return Json(Validaciones.IsValidoNIFNIE(DocIdentidad, (Enumerados.TipoDocumentacion)IdTipoDocIdentidad)); }
    猜你喜欢
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 2011-12-14
    • 1970-01-01
    • 2012-07-23
    • 2014-02-18
    相关资源
    最近更新 更多