0

以前に属性を作成しましたが、IIは以前に検証属性を作成していません。私はそれがどのように一緒に機能するかについて真剣に混乱しています。私はこれを達成する方法についてオンラインでほとんどのチュートリアルを読みました。しかし、私は熟考するためにいくつかの質問を残されています。

特定のJquery変数が設定されている場合にのみリモート関数を呼び出すrequiredIf属性を書き込もうとしていることを覚えておいてください...これは偶然にもビューステートからプルされた変数です...私はその部分を作ることができたと思います私のビューモデルの。しかし、私は逸脱します

1)C#コードは少し混乱しています。私の属性は、ValidationAttribute、IClientValidatableクラス、およびインターフェイスをそれぞれ拡張する必要があることを知っています。しかし、私は、オーバーライドされたメソッドのそれぞれが何をすべきかについて少し混乱していますか?requiredIfを書き込もうとしていますが、これらのメソッドを上書きすると、この目標を達成するのにどのように役立ちますか?

2)変数がない場合は、リモート関数がフィールドの検証を試みないようにします。フォームにメッセージが表示されないようにします。チュートリアルの多くはそれを中心に展開しているようです。

3)この関数をビューに追加するためにjqueryで何をする必要があるかについて混乱しています...これを機能させるためにJQueryに何を追加する必要がありますか...余分なコーディングがたくさんあるようです同じことを同じことをするjquery関数を、同じ鉱石の少ないコーディングで単純に入力できたとき...それはサーバー側の検証も追加することを知っています。これは良いことです。それでも...

これが、この方程式のjquery側にあるものです...

(function ($) {
    $validator.unobtrusive.adapters.addSingleVal("requiredifattribute", "Dependent");
    $validator.addMethod("requiredifattribute", function (value, element, params) {
        if (!this.optional(element)) {
            var otherProp = $('#' + params)
            return (otherProp.val() != value);
        }
        return true;
    })
}(jQuery));

これが私の属性です(これは基本的に、チュートリアルの場合に必要なものからカーボンコピーされたものです...もっとカスタマイズする必要があることはわかっていますが、すべての部分が何をしているのかがよくわかったら、それを行います...

[AttributeUsage(AttributeTargets.Property)]
public class RequiredIfAttribute  : ValidationAttribute, IClientValidatable {
    private const string errorMessage = "The {0} is required.";
    //public string 
    private RequiredAttribute innerAttribute = new RequiredAttribute();
    public string DependentProperty { get; set; }
    public object TargetValue { get; set; }

    public RequiredIfAttribute(string dependentProperty, object targetValue){
        this.DependentProperty = dependentProperty;
        this.TargetValue = targetValue;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) {
        var field = validationContext.ObjectInstance.GetType().GetProperty(DependentProperty);
        if (field != null) {
            var dependentValue = field.GetValue(validationContext.ObjectInstance, null);
            if ((dependentValue == null && TargetValue == null) || (dependentValue.Equals(TargetValue))) {
                if (!innerAttribute.IsValid(value))
                    return new ValidationResult(ErrorMessage);
            }
        }
        return ValidationResult.Success;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) {
        ModelClientValidationRule modelClientValidationRule = new ModelClientValidationRule {
            ErrorMessage = FormatErrorMessage(metadata.DisplayName),
            ValidationType = "requiredifattribute"
        };
        modelClientValidationRule.ValidationParameters.Add("dependent", DependentProperty);
        yield return modelClientValidationRule;
    }
}

更新:私が持っているものは単に機能していません

これが私のモデルのプロパティが上記の属性でどのように注釈されているかです

    [RequiredIf("isFlagSet", true)]
    [Remote("ValidateHosFin", "EditEncounter", AdditionalFields = "hospitalFin, encflag", ErrorMessage = "Got Damn this is complex!")]
    [MinLength(6)]
    public string HostpitalFinNumber { get; set; }

この検証のキーを設定しようとしていた私のビューの値は、次のように設定されています...

   ViewData["ADDENCOREDITTEMP"] = encflag;
   if (encflag == "AddEnc"){
       isFlagSet = true;
   }

私はそれを私のページにそのように埋め込みます...

@Html.Hidden("isFlagSet", isFlagSet, new { id = "isFlagSet"}) 

フォームを送信できません...これを試して機能させたと言った人は、コードを投稿していただけますか?

4

1 に答える 1

0

モデル:

public class X
{
    [RequiredIf("y", "y", ErrorMessage = "y is not y")]
    public string x { get; set; }

    public string y { get; set; }
}

意見:

@using(Html.BeginForm())
{
    @Html.ValidationSummary()

    @Html.TextBoxFor(m => m.x)
    @Html.TextBoxFor(m => m.y)

    <input type="submit"/>
}

サーバー側で検証が失敗したと思いますか?ビューモデルにプロパティがありますisFlagSetか?

于 2012-10-16T18:53:11.700 に答える