1

複数の必須フィールドの簡単な検証のために、ここで説明するカスタムバリデーターを使用しています

目的の動作が得られ、検証の概要メッセージが正しく表示されますが、現在欠落しているのは、組み込みのバリデーターが使用されている場合に追加される、無効な入力要素の検証エラーcssクラスの欠如です。

これは正しい動作です。

<input class="input-validation-error" name="ModelName" ... />

そして、これは私が言及されたカスタムバリデーターを使用するときに得られるものです:

<input name="ModelName" ... />

サーバー側の検証について言及していることに注意してください。

アップデート

これは私のモデルです:

public class Register
{
        [MultiFieldRequired(new[] { "Name", "UserName" }, ErrorMessage = "Please provide all required information")]
        [Display(Name = "Name")]
        public string Name { get; set; }

        [MultiFieldRequired(new[] { "Name", "UserName" }, ErrorMessage = "Please provide all required information")]
        [Display(Name = "User name")]
        public string UserName { get; set; }
}

そして、これはレンダリングされた出力です:

<input class="text-box single-line" data-val="true" data-val-multifield="Please provide all required information" id="Name" name="Name" type="text" value="" />
<input class="text-box single-line" data-val="true" data-val-multifield="Please provide all required information" id="UserName" name="UserName" type="text" value="" />

私が抱えていた問題は、モデルクラス全体をMultiFieldRequired属性で装飾した場合にのみ発生することに気づきました。

[MultiFieldRequired(new[] { "Name", "UserName" }, ErrorMessage = "Please provide all required information")]
public class Register
{
...

この場合、無効なフィールドでcssクラスが変更されていませんが、他のシナリオでは、モデル内のすべてのフィールドに注釈を付けると、同じエラーメッセージに無効なフィールドの数を掛けたものが表示されます。

したがって、要約すると、無効なフィールドの数に関係なく1つのエラーメッセージが必要です。また、無効なフィールドに.input-validation-errorクラスのマークを付ける必要があります。

4

2 に答える 2

2

これをテストしたところ、問題なく動作しました。これが私がしたことです:

コントローラ:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(IndexModel model)
    {
        if (ModelState.IsValid)
        {
            return RedirectToAction("NextAction");
        }
        return View(model);
    }
}

モデル:

public class IndexModel
{
    [MultiFieldRequiredAttribute(new string[] { "AreaCode", "PhoneNumber" })]
    public string AreaCode { get; set; }

    [MultiFieldRequiredAttribute(new string[] { "AreaCode", "PhoneNumber" })]
    public string PhoneNumber { get; set; }
}

例で提供されているとおりに検証を使用しました。

public class MultiFieldRequiredAttribute : ValidationAttribute, IClientValidatable
{
    private readonly string[] _fields;

    public MultiFieldRequiredAttribute(string[] fields)
    {
        _fields = fields;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        foreach (string field in _fields)
        {
            PropertyInfo property = validationContext.ObjectType.GetProperty(field);
            if (property == null)
                return new ValidationResult(string.Format("Property '{0}' is undefined.", field));

            var fieldValue = property.GetValue(validationContext.ObjectInstance, null);

            if (fieldValue == null || String.IsNullOrEmpty(fieldValue.ToString()))
                return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
        }

        return null;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRule
        {
            ErrorMessage = this.ErrorMessage,
            ValidationType = "multifield"
        };
    }
}

意見:

@model IndexModel

@using (Html.BeginForm())
{
    @Html.EditorFor(m => m.AreaCode)
    @Html.EditorFor(m => m.PhoneNumber)
    <input type="submit" value="submit" />
}

次にビューを表示すると、市外局番として次のように表示されます。

<input class="text-box single-line" data-val="true" data-val-multifield="" id="AreaCode" name="AreaCode" type="text" value="" />

次に送信ボタンをクリックすると、次のようになります。

<input class="input-validation-error text-box single-line" data-val="true" data-val-multifield="" id="AreaCode" name="AreaCode" type="text" value="" />

送信ボタンをクリックすると、input-validation-errorが追加されます。

于 2012-05-18T13:49:32.917 に答える
1

ビュー内の無効なフィールドは、属性の位置に関係する.input-validation-errorクラスでマークされると予想していたので、カスタムバリデーター属性を使用してモデルクラスに次のように注釈を付けました。

[MultiFieldRequired(new[] { "Name", "UserName" }, ErrorMessage = "Please provide all required information")]
public class Register
{
        [Display(Name = "Name")]
        public string Name { get; set; }

        [Display(Name = "User name")]
        public string UserName { get; set; }
}

一方、各フィールドに注釈を付ける場合:

public class Register
{
        [MultiFieldRequired(new[] { "Name", "UserName" }, ErrorMessage = "Please provide all required information")]
        [Display(Name = "Name")]
        public string Name { get; set; }

        [MultiFieldRequired(new[] { "Name", "UserName" }, ErrorMessage = "Please provide all required information")]
        [Display(Name = "User name")]
        public string UserName { get; set; }
}

私のビューでは、検証の概要に複数の同一のメッセージが生成されます。

そのため、 ValidationSummaryを使用して次のようなカスタム検証サマリーエラーメッセージが表示されることになりました。

@Html.ValidationSummary(true, "Please provide all required information")

私のフィールドは次のような単純なアスタリスクで装飾されています。

public class Register
{
        [Required(ErrorMessage = "*")]
        [Display(Name = "Name")]
        public string Name { get; set; }

        [Required(ErrorMessage = "*")]
        [Display(Name = "User name")]
        public string UserName { get; set; }
}

最後に、私のビューは次のようにレンダリングされます。

検証エラーメッセージ

HTH

于 2012-05-21T11:56:50.860 に答える