私はjavascriptの控えめな検証を使用しています。いくつかのフォームで再利用しているビューモデルがあります。一部のフォームでは、ビューモデルのいくつかのプロパティが必要です。他の形式では、そうすべきではありません。これを達成できるように、プログラムでプロパティに[必須]を設定する方法はありますか?
ありがとう!
私はjavascriptの控えめな検証を使用しています。いくつかのフォームで再利用しているビューモデルがあります。一部のフォームでは、ビューモデルのいくつかのプロパティが必要です。他の形式では、そうすべきではありません。これを達成できるように、プログラムでプロパティに[必須]を設定する方法はありますか?
ありがとう!
これらはコンパイル時に実装され、動的に追加できないため、DataAnnotations を使用して行うことはできません。次のいずれかを実行できます
適切な注釈を持つさまざまなビュー モデルを作成する
また
ビューモデルを送信して、モデルの元のアクションに基づいてモデルをチェックし、モデルの状態に追加できる検証エラーのリストを返すサービスを用意します。
また
などの ViewModel にプロパティを配置し、string IsBeingUsedFor
それを RequiredIf DataAnnotation と組み合わせて使用します。 以下は、条件付き DataAnnotations を使用するビルド済みのライブラリの例です。[RequireIf("IsBeingUsedFor", "Action_A")] と言うことができます。
これらは必ずしもすべてのオプションではありませんが、よりクリーンなオプションの一部です。これはすべて JavaScript で行うことができますが、「悪い人」がフォームを送信してクライアント側の検証をバイパスすると、サーバー側の検証が失われ、アプリケーションに穴が開く可能性があります。
データ注釈でこれを行う方法がわかりません。ただし、ビューでは、必要なルールを JavaScript で追加/削除できます。
$("#myProperty").rules("add", { required: true });
また
$("#myProperty").rules("remove", "required");
属性は実行時にリフレクションを介してアクセスされるため、必要なときにオンとオフを切り替えることができることを認識していません。私のアドバイスは、「必須」ViewModel と「NotRequired」ビューモデルを作成することです。これはおそらくあなたが望むものだと思いますが、私が考えることができる最も簡単な方法です。
クライアント側の検証で十分な場合は、Razor ビューで次の操作を実行できます。たとえば、次のようになります。
@Html.LabelFor(model => model.title, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@if (Model.IsTitleRequired == true)
{
@Html.TextBoxFor(model => model.title, new { @required = true })
}
else
{
@Html.TextBoxFor(model => model.title)
}
@Html.ValidationMessageFor(model => model.title)
</div>