[asp.net-mvc] MVC 모델에는 true가 필요합니다.

데이터 주석을 통해 부울 속성을 true로 설정하도록 요구하는 방법이 있습니까?

public class MyAwesomeObj{
    public bool ThisMustBeTrue{get;set;}
}



답변

자신 만의 유효성 검사기를 만들 수 있습니다.

public class IsTrueAttribute : ValidationAttribute
{
    #region Overrides of ValidationAttribute

    /// <summary>
    /// Determines whether the specified value of the object is valid. 
    /// </summary>
    /// <returns>
    /// true if the specified value is valid; otherwise, false. 
    /// </returns>
    /// <param name="value">The value of the specified validation object on which the <see cref="T:System.ComponentModel.DataAnnotations.ValidationAttribute"/> is declared.
    ///                 </param>
    public override bool IsValid(object value)
    {
        if (value == null) return false;
        if (value.GetType() != typeof(bool)) throw new InvalidOperationException("can only be used on boolean properties.");

        return (bool) value;
    }

    #endregion
}


답변

서버 측과 클라이언트 측 모두에 대한 유효성 검사기를 만들 것입니다. MVC 및 눈에 잘 띄지 않는 양식 유효성 검사를 사용하면 다음을 수행하여 간단히 수행 할 수 있습니다.

먼저 다음과 같이 서버 측 유효성 검사를 수행하기 위해 프로젝트에 클래스를 만듭니다.

public class EnforceTrueAttribute : ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        if (value == null) return false;
        if (value.GetType() != typeof(bool)) throw new InvalidOperationException("can only be used on boolean properties.");
        return (bool)value == true;
    }

    public override string FormatErrorMessage(string name)
    {
        return "The " + name + " field must be checked in order to continue.";
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRule
        {
            ErrorMessage = String.IsNullOrEmpty(ErrorMessage) ? FormatErrorMessage(metadata.DisplayName) : ErrorMessage,
            ValidationType = "enforcetrue"
        };
    }
}

그런 다음 모델에서 적절한 속성에 주석을 추가합니다.

[EnforceTrue(ErrorMessage=@"Error Message")]
public bool ThisMustBeTrue{ get; set; }

마지막으로 View에 다음 스크립트를 추가하여 클라이언트 측 유효성 검사를 활성화합니다.

<script type="text/javascript">
    jQuery.validator.addMethod("enforcetrue", function (value, element, param) {
        return element.checked;
    });
    jQuery.validator.unobtrusive.adapters.addBool("enforcetrue");
</script>

참고 : 우리는 이미 GetClientValidationRules주석을 모델에서 뷰로 푸시 하는 메서드 를 만들었습니다 .

리소스 파일을 사용하여 국제화를위한 오류 메시지를 제공하는 경우 FormatErrorMessage호출을 제거 (또는 기본 호출)하고 다음과 같이 GetClientValidationRules메서드를 조정합니다 .

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
    string errorMessage = String.Empty;
    if(String.IsNullOrWhiteSpace(ErrorMessage))
    {
        // Check if they supplied an error message resource
        if(ErrorMessageResourceType != null && !String.IsNullOrWhiteSpace(ErrorMessageResourceName))
        {
            var resMan = new ResourceManager(ErrorMessageResourceType.FullName, ErrorMessageResourceType.Assembly);
            errorMessage = resMan.GetString(ErrorMessageResourceName);
        }
    }
    else
    {
        errorMessage = ErrorMessage;
    }

    yield return new ModelClientValidationRule
    {
        ErrorMessage = errorMessage,
        ValidationType = "enforcetrue"
    };
}


답변

나는 이것이 오래된 게시물이라는 것을 알고 있지만 이것을 수행하는 간단한 서버 측 방법을 공유하고 싶었습니다. true로 설정된 공용 속성을 만들고 bool을 해당 속성과 비교합니다. bool이 선택되지 않은 경우 (기본적으로 false) 양식의 유효성이 검사되지 않습니다.

public bool isTrue
{ get { return true; } }

[Required]
[Display(Name = "I agree to the terms and conditions")]
[Compare("isTrue", ErrorMessage = "Please agree to Terms and Conditions")]
public bool AgreeTerms { get; set; }

면도기 코드

@Html.CheckBoxFor(m => Model.AgreeTerms, new { id = "AgreeTerms", @checked = "checked" })
<label asp-for="AgreeTerms" class="control-label"></label>
<a target="_blank" href="/Terms">Read</a>
<br />
@Html.ValidationMessageFor(model => model.AgreeTerms, "", new { @class = "text-danger" })
@Html.HiddenFor(x => Model.isTrue)


답변

몇 가지 솔루션을 시도했지만 클라이언트 및 서버 측 유효성 검사를 모두 수행하는 데 완전히 효과가 없었습니다. 그래서 MVC 5 응용 프로그램에서 작업을 수행하기 위해 수행 한 작업 :

ViewModel에서 (서버 측 유효성 검사 용) :

public bool IsTrue => true;

[Required]
[Display(Name = "I agree to the terms and conditions")]
[Compare(nameof(IsTrue), ErrorMessage = "Please agree to Terms and Conditions")]
public bool HasAcceptedTermsAndConditions { get; set; }

Razor 페이지에서 (클라이언트 측 유효성 검사 용) :

<div class="form-group">
   @Html.CheckBoxFor(m => m.HasAcceptedTermsAndConditions)
   @Html.LabelFor(m => m.HasAcceptedTermsAndConditions)
   @Html.ValidationMessageFor(m => m.HasAcceptedTermsAndConditions)

   @Html.Hidden(nameof(Model.IsTrue), "true")
</div>


답변

사람들을 다음 Fiddle로 안내하고 싶습니다 : https://dotnetfiddle.net/JbPh0X

사용자 [Range(typeof(bool), "true", "true", ErrorMessage = "You gotta tick the box!")]가 부울 속성에 추가
되어 서버 측 유효성 검사가 작동합니다.

클라이언트 측 유효성 검사도 작동하기 위해 다음 스크립트를 추가했습니다.

// extend jquery range validator to work for required checkboxes
var defaultRangeValidator = $.validator.methods.range;
$.validator.methods.range = function(value, element, param) {
    if(element.type === 'checkbox') {
        // if it's a checkbox return true if it is checked
        return element.checked;
    } else {
        // otherwise run the default validation function
        return defaultRangeValidator.call(this, value, element, param);
    }
}


답변

문자열 표현이 다음과 같은지 확인하십시오 True.

[RegularExpression("True")]
public bool TermsAndConditions { get; set; }


답변

고유 한 속성을 만들거나 CustomValidationAttribute를 사용할 수 있습니다 .

CustomValidationAttribute를 사용하는 방법은 다음과 같습니다.

[CustomValidation(typeof(BoolValidation), "ValidateBool")]

여기서 BoolValidation은 다음과 같이 정의됩니다.

public class BoolValidation
{
  public static ValidationResult ValidateBool(bool boolToBeTrue)
  {
    if (boolToBeTrue)
    {
      return ValidationResult.Success;
    }
    else
    {
      return new ValidationResult(
          "Bool must be true.");
    }
  }