嘿,我想知道是否有人可以帮助我进行一些自定义验证。这背后的基本思想是,当填写表单时,向用户提供若干复选框选项,其中必须选择至少一个。
我已经让服务器端验证工作正常,但我对如何在客户端上进行验证用户输入感到有点困惑。
我有以下ViewModel:
[CustomAttributes.AtLeastOneListItemSelected(ErrorMessage="You must select at least one game")]
public List<Game> GamesAppliedFor { get; set; }
.
.
.
public class Game
{
public int ID { get; set; }
public string Title { get; set; }
public bool Selected { get; set; }
}
在另一个项目中,我有自定义验证属性,'AtLeastOneListItemSelected'有以下代码:
public class AtLeastOneListItemSelected : ValidationAttribute, IClientValidatable
{
public override bool IsValid(object value)
{
if (value is IEnumerable)
{
foreach (var property in (IEnumerable)value)
{
var selectedProperty = property.GetType().GetProperty("Selected");
if (selectedProperty != null)
{
return (bool)selectedProperty.GetValue(property, null);
}
}
}
return false;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = ErrorMessage,
ValidationType = "atleastone"
};
}
最后但并非最不重要的是,我的观点包含以下内容:
<div class="form-group">
@Html.LabelFor(model => model.GamesAppliedFor, new { @class = "col-md-4 control-label" })
<div class="col-md-4">
@foreach (var game in Model.GamesAppliedFor.Select((value, index) => new { index, value}))
{
<div class="checkbox">
<label>
@Html.HiddenFor(model => model.GamesAppliedFor[game.index].ID)
@Html.CheckBoxFor(model => model.GamesAppliedFor[game.index].Selected, new {
id = Model.GamesAppliedFor[game.index].ID,
})
@Html.DisplayFor(model => model.GamesAppliedFor[game.index].Title)
</label>
</div>
}
@Html.ValidationMessageFor(model => model.GamesAppliedFor)
</div>
</div>
现在我打算为自定义属性添加必要的jquery代码但是我完全忘记的是我没有将List输出到屏幕 - 只是其中的属性,因此我的当前方法不起作用。
我的问题是你真的会如何建议我设置客户端验证来处理选定的属性,因为我不能将数据注释放在属性本身上 - 只有类不是所有类都是必需的。
欢迎任何建议。谢谢。