gpt4 book ai didi

c# - 如何根据复选框值验证文本框

转载 作者:行者123 更新时间:2023-11-30 14:51:14 25 4
gpt4 key购买 nike

我正在尝试根据复选框值验证文本框。请查看我的模型类和 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;
}
}

您可以在 product 类的 ProductName 属性中看到上面的内容,其中我正在尝试传递 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 };
}
}
}
}
}

Controller

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>

到目前为止我已经尝试了上面的代码,实际上我需要当我点击复选框时它应该开始验证我的 ProductName 文本框,如果取消选中则不会。我在上面的代码中遗漏了一些东西,请帮助并纠正我。

最佳答案

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

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 };
}
}
}
}
}

Global.asax 文件的 Application_Start 添加这部分:

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 为真时验证 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; }

关于c# - 如何根据复选框值验证文本框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35031124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com