如何基于复选框值验证文本框

本文关键字:文本 验证 何基于 复选框 | 更新日期: 2023-09-27 18:32:00

我正在尝试根据复选框值验证文本框。 请查看我的模型类和 IsValid 覆盖方法。

public class Product
{
    //Below property value(HaveExperiance)
    [MustBeProductEntered(HaveExperiance)] 
    public string ProductName { get; set; }
    public bool HaveExperiance { get; set; }
}
public class MustBeTrueAttribute : ValidationAttribute
{
    //Here i need the value of HaveExperiance property which 
    //i passed from  [MustBeProductEntered(HaveExperiance)]  in product class above.
    public override bool IsValid(object value)
    {
        return value is bool && (bool)value;
    }
}

您可以在上面看到productProductName属性中,我正在尝试传递HaveExperiance类属性值,如果选中,则用户必须填写ProductName文本框。

所以我的原始问题是,我如何根据HaveExperiance值验证ProductName文本框,提前感谢。

编辑:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Mvc;
namespace Mvc.Affiliates.Models
{
    public class MyProducts
    {
        [Key]
        [Required(ErrorMessage = "Please insert product id.")]
        public string ProductId { get; set; }
        [RequiredIf("HaveExperiance")]
        public string ProductName { get; set; }
        public bool HaveExperiance { get; set; }
        public List<MyProducts> prolist { get; set; }
    }
    public class RequiredIfAttribute : ValidationAttribute
    {
        private RequiredAttribute _innerAttribute = new RequiredAttribute();
        public string Property { get; set; }
        public object Value { get; set; }
        public RequiredIfAttribute(string typeProperty)
        {
            Property = typeProperty;
        }
        public RequiredIfAttribute(string typeProperty, object value)
        {
            Property = typeProperty;
            Value = value;
        }
        public override bool IsValid(object value)
        {
            return _innerAttribute.IsValid(value);
        }
    }
    public class RequiredIfValidator : DataAnnotationsModelValidator<RequiredIfAttribute>
    {
        public RequiredIfValidator(ModelMetadata metadata, ControllerContext context, RequiredIfAttribute attribute) : base(metadata, context, attribute) { }
        public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
        {
            return base.GetClientValidationRules();
        }
        public override IEnumerable<ModelValidationResult> Validate(object container)
        {
            PropertyInfo field = Metadata.ContainerType.GetProperty(Attribute.Property);
            if (field != null)
            {
                var value = field.GetValue(container, null);
                if ((value != null && Attribute.Value == null) || (value != null && value.Equals(Attribute.Value)))
                {
                    if (!Attribute.IsValid(Metadata.Model))
                    {
                        yield return new ModelValidationResult { Message = ErrorMessage };
                    }
                }
            }
        }
    }

控制器

public class HomeController : Controller
    {
        //
        // GET: /Home/
        MvcDbContext _db = new MvcDbContext();
        public ActionResult Index()
        {
          return View();
        }
        [HttpPost]
        public ActionResult Index(MyProducts model)
        {
            string ProductId = model.ProductId;
            string ProductName = model.ProductName;
            //bool remember = model.HaveExperiance;
            return View();
        }
    }

视图

@model   Mvc.Affiliates.Models.MyProducts
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Details</h2>
<br />
<div style="height:200px; width:100%">
  @using  (Html.BeginForm("Index","Home", FormMethod.Post))
    {
   <h2>Details</h2>
        @Html.LabelFor(model => model.ProductId)
        @Html.TextBoxFor(model => model.ProductId)
        @Html.LabelFor(model => model.ProductName)
        @Html.EditorFor(model => model.ProductName)
        @Html.ValidationMessageFor(model => model.ProductName, "*")
        @Html.CheckBoxFor(model => model.HaveExperiance)
        @Html.ValidationMessageFor(model => model.HaveExperiance, "*")
       <input type="submit" value="Submit" />
  }
</div>

到目前为止,我已经尝试了上面的代码,实际上当我单击复选框时我需要,然后它应该开始验证我的产品名称文本框,如果未选中,则不。 我在上面的代码中缺少一点东西,请帮助并纠正我。

如何基于复选框值验证文本框

这是一个完整的示例,说明如何基于另一个属性创建自定义验证属性:

public class RequiredIfAttribute : ValidationAttribute
{
    private RequiredAttribute _innerAttribute = new RequiredAttribute();
    public string Property { get; set; }
    public object Value { get; set; }
    public RequiredIfAttribute(string typeProperty) {
        Property = typeProperty;
    }
    public RequiredIfAttribute(string typeProperty, object value)
    {
        Property = typeProperty;
        Value = value;
    }
    public override bool IsValid(object value)
    {
        return _innerAttribute.IsValid(value);
    }
}
public class RequiredIfValidator : DataAnnotationsModelValidator<RequiredIfAttribute>
{
    public RequiredIfValidator(ModelMetadata metadata, ControllerContext context, RequiredIfAttribute attribute) : base(metadata, context, attribute) { }
    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        return base.GetClientValidationRules();
    }
    public override IEnumerable<ModelValidationResult> Validate(object container)
    {
        PropertyInfo field = Metadata.ContainerType.GetProperty(Attribute.Property);
        if (field != null) {
            var value = field.GetValue(container, null);
            if ((value != null && Attribute.Value == null) || (value != null && value.Equals(Attribute.Value))) {
                if (!Attribute.IsValid(Metadata.Model)) {
                    yield return new ModelValidationResult { Message = ErrorMessage };
                }
            }
        }
    }
}

Application_Start Global.asax文件中,添加以下部分:

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredIfAttribute), typeof(RequiredIfValidator));
需要

此部分来注册RequiredIfValidator否则 MVC 将仅使用RequiredIfAttribute忽略RequiredIfValidator

如果要验证ProductName HaveExperiance是否有值:

[RequiredIf("HaveExperiance")]
public string ProductName { get; set; }

如果只想在 HaveExperiance 为 false 时验证ProductName

[RequiredIf("HaveExperiance", false)]
public string ProductName { get; set; }

如果只想在HaveExperiance为 true 时验证ProductName

[RequiredIf("HaveExperiance", true)]
public string ProductName { get; set; }

在类RequiredIfAttribute我创建了一个 RequiredAttribute 对象,仅用于验证传递给IsValid方法的值。

Property字段用于保存激活验证的属性的名称。它在类RequiredIfValidator中使用,以使用反射(field.GetValue(container, null))获取字段电流值。

当你在代码中调用验证时(例如,当你执行if(TryValidateModel(model))时),首先调用RequiredIfValidator类,然后调用RequiredIfAttribute(通过Attribute.IsValid(Metadata.Model))类,如果某些条件有效((value != null && Attribute.Value == null) || (value != null && value.Equals(Attribute.Value)))。

最后一件事。由于RequiredIfAttribute继承自ValidationAttribute因此还可以以与任何其他验证属性相同的方式使用错误消息。

[RequiredIf("HaveExperiance", true, ErrorMessage = "The error message")]
public string ProductName { get; set; }
[RequiredIf("HaveExperiance", true, ErrorMessageResourceName = "ResourceName", ErrorMessageResourceType = typeof(YourResourceType))]
public string ProductName { get; set; }