型号:
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,以确保它正常工作。但是,如果我没有从列表中选择任何标签并提交表单,它会尝试处理它而不会出现任何错误,表明我需要先选择一个标签。
我在这里做错了什么?
答案 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/