gpt4 book ai didi

asp.net-mvc - 如何在 ASP MVC 中实现 Semi-Required 属性?

转载 作者:行者123 更新时间:2023-12-02 20:08:54 24 4
gpt4 key购买 nike

我有一个 MVC 应用程序,其中包含 DropDownList 和 TextBox。我正在使用 MVC 验证,对此我很满意。

目前,DropDownList 是[必需],但我想让 TextBox 可以充当 DropDownList 的“其他:请指定”样式输入。

如何使 DropDownList 上的 [Required] 属性以 TextBox 为空为条件?

This问题很相似,但已经一年多了。当前版本的 MVC 中有什么可以让这变得容易吗?

最佳答案

编写自定义验证属性非常容易:

public class RequiredIfPropertyIsEmptyAttribute : RequiredAttribute
{
private readonly string _otherProperty;
public RequiredIfPropertyIsEmptyAttribute(string otherProperty)
{
_otherProperty = otherProperty;
}

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var property = validationContext.ObjectType.GetProperty(_otherProperty);
if (property == null)
{
return new ValidationResult(string.Format("Unknown property {0}", _otherProperty));
}

var otherPropertyValue = property.GetValue(validationContext.ObjectInstance, null);
if (otherPropertyValue == null)
{
return base.IsValid(value, validationContext);
}
return null;
}
}

然后你就可以有一个 View 模型:

public class MyViewModel
{
public string Foo { get; set; }

[RequiredIfPropertyIsEmpty("Foo")]
public string SelectedItemId { get; set; }

public IEnumerable<SelectListItem> Items {
get
{
return new[]
{
new SelectListItem { Value = "1", Text = "item 1" },
new SelectListItem { Value = "2", Text = "item 2" },
new SelectListItem { Value = "3", Text = "item 3" },
};
}
}
}

Controller :

public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}

[HttpPost]
public ActionResult Index(MyViewModel model)
{
return View(model);
}
}

当然还有 View :

@model MyViewModel

@using (Html.BeginForm())
{
<div>
@Html.LabelFor(x => x.Foo)
@Html.EditorFor(x => x.Foo)
</div>
<div>
@Html.LabelFor(x => x.SelectedItemId)
@Html.DropDownListFor(x => x.SelectedItemId, Model.Items, "-- select an item --")
@Html.ValidationMessageFor(x => x.SelectedItemId)
</div>

<input type="submit" value="OK" />
}

或者您可以像我一样:下载并使用 FluentValidation.NET library ,忘记数据注释并编写以下验证逻辑,这看起来非常不言自明:

public class MyViewModelValidator: AbstractValidator<MyViewModel> 
{
public MyViewModelValidator()
{
RuleFor(x => x.SelectedItemId)
.NotEmpty()
.When(x => !string.IsNullOrEmpty(x.Foo));
}
}

只需继续Install-Package FluentValidation.MVC3,让您的生活更轻松。

关于asp.net-mvc - 如何在 ASP MVC 中实现 Semi-Required 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7995471/

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