0

カスタム RequiredAttribute にステップ インできません。

私はこの記事に従いました方法: .NET Framework ソースをデバッグする

[ツール] > [オプション] > [デバッグ] > [全般] で:

私はEnable .NET Framework source steppingチェックしました

チェックをEnable Just My Code外しました

単体テストでカスタム RequiredAttribute の基本的な例を作成しました。

using System.ComponentModel.DataAnnotations;

public class CustomRequiredAttribute : RequiredAttribute
{
    public bool IsValid(object value, object container)
    {
        if (value == null)
        {
            return false;
        }

        string str = value as string;

        if (!string.IsNullOrWhiteSpace(str))
        {
            return true;
        }

        return false;
    }
}

このテスト モデルで使用:

public class CustomRequiredAttributeModel
{
    [CustomRequired]
    public string Name { get; set; }
}

単体テストは次のとおりです (アサートを正しく渡します)。

    [Fact]
    public void custom_required_attribute_test()
    {
        // arrange
        var model = new CustomRequiredAttributeModel();
        var controller = AccountController();

        // act
        controller.ValidateModel(model);

        // assert
        Assert.False(controller.ModelState.IsValid);
    }

単体テストでは、次のヘルパー メソッドを使用します。

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Mvc;

public static class ModelHelper
{
    public static void ValidateModel(this Controller controller, object viewModel)
    {
        controller.ModelState.Clear();

        var validationContext = new ValidationContext(viewModel, null, null);
        var validationResults = new List<ValidationResult>();

        Validator.TryValidateObject(viewModel, validationContext, validationResults, true);

        foreach (var result in validationResults)
        {
            if (result.MemberNames.Any())
            {
                foreach (var name in result.MemberNames)
                {
                    controller.ModelState.AddModelError(name, result.ErrorMessage);
                }
            }
            else
            {
                controller.ModelState.AddModelError("", result.ErrorMessage);
            }
        }
    }
}
4

1 に答える 1

1

CustomRequiredAttribute で、オーバーライドを使用するようにメソッドを変更します。

public class CustomRequiredAttribute : RequiredAttribute
{
    public override bool IsValid(object value)
    {
        if (value == null)
        {
            return false;
        }

        string str = value as string;

        if (!string.IsNullOrWhiteSpace(str))
        {
            return true;
        }

        return false;
    }
}
于 2013-10-07T01:58:57.703 に答える