列表字段上的自定义验证器似乎根本不起作用

时间:2011-12-17 16:17:18

标签: asp.net-mvc-3 custom-validators data-annotations

型号:

using System.ComponentModel.DataAnnotations;
using MySite.Validators;

namespace MySite.Models
{
    public class AddItem
    {
        [Required(ErrorMessage = "Name is required")]
        public string Name { get; set; }

        [TagValidation(ErrorMessage = "At least one tag is required")]
        public virtual List<int> Tags { get; set; }
    }
}

查看:

@using (Html.BeginForm()) {
    ...
    <div class="editor-label">
        @Html.LabelFor(model => model.Tags, "Tags")
    </div>
    <div class="editor-field">
        @Html.ListBox("Tags")
        @Html.ValidationMessageFor(model => model.Tags)
    </div>
    ...
}

验证

using System.ComponentModel.DataAnnotations;

namespace MySite.Validators
{
    public class TagValidationAttribute : ValidationAttribute
    {
        public override bool IsValid(object value)
        {
            return false;
        }
    }
}

我希望我的验证器首先返回false,以确保它正常工作。但是,如果我没有从列表中选择任何标签并提交表单,它会尝试处理它而不会出现任何错误,表明我需要先选择一个标签。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

我已经在我的控制器中注释了if(ModelState.IsValid == false)检查,所以我没有得到任何验证。我最初这样做的原因是因为当我试图将模型传递回视图时出现错误,因为视图中的ListBox字段需要IEnumerable而不是List。

以下是我修复这两个问题的方法(在控制器中):

[HttpPost]
public ActionResult AddItem(AddItem AddItem)
{
    if (ModelState.IsValid == false)
    {
        ModelState.AddModelError("", "Model not valid.");

        List<Tag> Tags = Db.Tags.ToList();

        ViewBag.Tags = new SelectList(Tags, "TagId", "Name");

        return View(AddItem);
    }

    //...
}

答案 1 :(得分:0)

要获得客户端自定义验证,您需要在JQuery中实现,我假设您正在使用ASP.net MVC 3不引人注意的验证。

http://thepursuitofalife.com/asp-net-mvc-3-unobtrusive-javascript-validation-with-custom-validators/