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 を予期していたため、モデルをビューに戻そうとしたときにエラーが発生したためでした。

両方の問題を(コントローラーで)修正した方法は次のとおりです。

[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 に答える