6

私はこの記事を参照しています:

http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

これは、Asp.Net MVC 2 でカスタム アノテーションを作成する方法を示しています。ただし、クライアント側の検証スクリプト、特に「MicrosoftMvcJQueryValidation」は、Asp.Net MVC4 では使用できません。Asp.Net Futures プロジェクトの一部である 1 つの記事でそれを読みました。Jquery を使用してクライアント側の検証を接続したいと考えています。プロジェクト テンプレート スクリプトのフォルダーに、次の名前のスクリプトが表示されます。

jquery.validate.min.js
jquery.validate.unobtrusive.min.js
jquery.unobtrusive-ajax.min.js

これらの既存のスクリプトを利用する方法はありますか? または、先物プロジェクトを強制的にダウンロードする必要がありますか?

4

2 に答える 2

14

この記事は、MicrosoftAjax を使用した MVC 2 に固有のものです。MVC 4 には、MS Ajax ファイルが非推奨になったため含まれなくなりました。推奨される方法は jquery を使用することです。

設定を確認するには、これらのスクリプトがレイアウトに含まれていることを確認してください

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>

これら 2 つの設定は、web.config ファイルの appSettings セクションにあります。

<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>

したがって、ViewModel にデータ注釈を追加すると、クライアント側とサーバー側の両方の検証が行われます。

public class MyModel 
{
    [Required]
    [StringLength(30)]
    public string FirstName { get; set; }

    [Required]
    [StringLength(30)]
    public string LastName { get; set; }
}

あなたの見解では、このようなコードがあることを確認してください

<div>
    @Html.LabelFor(model => model.FirstName)
</div>
<div>
    @Html.TextBoxFor(model => model.FirstName) <br/>
    @Html.ValidationMessageFor(model => model.FirstName)
</div>

<div>
    @Html.LabelFor(model => model.LastName)
</div>
<div>
    @Html.TextBoxFor(model => model.LastName) <br/>
    @Html.ValidationMessageFor(model => model.LastName)
</div>

アップデート

これは、私がRateRequiredIfCustomIndexRateと呼んだカスタムバリデーターの例です。これは、jquery検証に追加されるように、JavaScript側です

$("document").ready(function () {

    var isCustomRateRequired = document.getElementById("IsCustomRateRequired");

    isCustomRateRequired.onchange = function () {
        if (this.checked) {
            $('#Rate').attr('disabled', 'disabled');
            $('#Rate').val('');
        }
        else {
            $('#Rate').removeAttr('disabled');
        }
    };
});

jQuery.validator.addMethod("raterequiredifcustomindexrate", function (value, element, param) {
    var rateRequired = $("#CustomRateRequired").val();
    if (rateRequired && value == "") {
        return false;
    }
    return true;
});

jQuery.validator.unobtrusive.adapters.addBool("raterequiredifcustomindexrate");
于 2012-05-19T14:34:49.367 に答える
11

ここで欠けている重要な点は、サーバー側バリデーターが IClientValidatable インターフェイスを実装する必要があるということです。

public class RateRequiredIfCustomIndexRateAttribute : ValidationAttribute, IClientValidatable
{
    public override bool IsValid(object value)
    {
        return false;
    }

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

これを行うと、クライアント側の検証が適切に接続されます。これは、入力フィールドに「data-val-raterequiredifcustomindexrate」属性があることを確認することで確認できます。

于 2012-09-26T14:12:37.613 に答える