复杂类型列表的自定义不显眼验证

时间:2016-05-01 18:48:02

标签: c# asp.net-mvc validation unobtrusive-validation

嘿,我想知道是否有人可以帮助我进行一些自定义验证。这背后的基本思想是,当填写表单时,向用户提供若干复选框选项,其中必须选择至少一个。

我已经让服务器端验证工作正常,但我对如何在客户端上进行验证用户输入感到有点困惑。

我有以下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输出到屏幕 - 只是其中的属性,因此我的当前方法不起作用。

我的问题是你真的会如何建议我设置客户端验证来处理选定的属性,因为我不能将数据注释放在属性本身上 - 只有类不是所有类都是必需的。

欢迎任何建议。谢谢。

0 个答案:

没有答案