1

模型:

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,只是为了确保它正常工作。但是,如果我没有从列表中选择任何标签并提交表单,它会尝试处理它而不会出现任何错误,表明我需要先选择一个标签。

我在这里做错了什么?

4

2 回答 2

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);
    }

    //...
}
于 2012-06-21T22:41:38.097 回答
0

要获得客户端自定义验证,您需要在 JQuery 中实现,我假设您正在使用 ASP.net MVC 3 非干扰验证。

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

于 2011-12-17T17:51:36.077 回答