我正在尝试使用FluentValidation验证下拉列表。我想我做错了,但找不到解决办法。我需要你的帮助。
[FluentValidation.Attributes.Validator(typeof (MeetingAbstractValidator))]
public class MeetingAbstract
{
public string CompanyAllowedBoolLabel { get; set; }
public string CompanyAllowedBoolOptions { get; set; }
public string CompanyAllowedBoolText { get; set; }
...
}
class MeetingAbstractValidator : AbstractValidator<MeetingAbstract>
{
public MeetingAbstractValidator()
{
RuleFor(x => x.CompanyAllowedBoolText).NotEqual("Select Option...").
WithMessage(i18n_Models_Abstract.RequiredField); ;
}
}
<div class="row" style="padding-bottom: 10px">
<div class="col-md-10">
<div class="col-md-6">@Html.Label(Model.CompanyAllowedBoolLabel,
new { @class = "control-label mandatory" })</div>
<div class="col-md-4">
@{
var options = Model.CompanyAllowedBoolOptions;
var optionsList = options.Split(',').ToList();
var optionSelect = optionsList.Select(option =>
new SelectListItem() { Text = option, Value = option }).ToList();
optionSelect.Insert(0,new SelectListItem() {
Text = "Select Option...", Value = "0" });
}
@Html.DropDownListFor(model => model.CompanyAllowedBoolText,
optionSelect,
new { @class = "input-validation-error form-control" })
@Html.ValidationMessageFor(model => model.CompanyAllowedBoolText)
</div>
</div>
</div>
<div class="col-md-4">
<select class="form-control valid" id="CompanyAllowedBoolText"
Name="CompanyAllowedBoolText">
<option value="0">Select Option...</option>
<option value="да/yes">да/yes</option>
<option value="нет/no">нет/no</option>
</select>
<span class="field-validation-valid" data-valmsg-for="CompanyAllowedBoolText"
data-valmsg-replace="true"></span>
</div>
它适用于文本框。不是下拉。
答案 0 :(得分:3)
确保选择选项
的值为空optionSelect.Insert(0,new SelectListItem(){ Text =“Select Option ...”,Value =“”});
然后添加此
RuleFor ( x =&gt; x.CompanyAllowedBoolText )。 NotEmpty()。WithMessage(“您的错误 消息“)强>
答案 1 :(得分:0)
部分问题是您不应该验证特定类型的控件。验证下拉列表应该与验证文本框没有区别,它与所选值有关。当表单将DropDownList发布到服务器时,它只发布值,而不是文本。您正在检查文字。
问题的另一部分是您没有正确构建下拉列表。您应该对未选择的值使用内置功能。我不确定您为什么要尝试包含验证css类。你不应该。即:
@Html.DropDownListFor(model => model.CompanyAllowedBoolText, optionSelect,
"Select Option...")
在这种情况下,如果用户没有选择任何内容,则该值将为null或为空。所以你只需要使用必要的验证。请记住,文本没有发布,只有值。
RuleFor(x => x.CompanyAllowedBoolText).NotNull().NotEmpty().
WithMessage(i18n_Models_Abstract.RequiredField);
答案 2 :(得分:0)
根据您生成的html(以及下拉创建代码),CompanyAllowedBoolText
的发布值可以是
因此选项的值为VALUE,而不是选项的“text”。
所以你的规则应该检查
RuleFor(x => x.CompanyAllowedBoolText).NotEqual("0").<bla bla bla>();