0

私はこのデータ転送モデルを持っています:

[DataContract]
[Serializable]
class PersonDTO {

    [DataMember(Name="id")]
    public int id { get; set; }


    [DataMember(Name="name")]
    [Required]
    public string name { get; set; }


}

このモデルを作成操作と更新操作の両方に使用できるようにしたいと思います。ここでの問題は、新しいPersonを作成するときに、そのIDがまだ存在しないことです(したがって、[必須]アノテーションがありません)。ただし、更新中、IDはすでに存在するため、必須フィールドである必要があります。

私のコントローラーには、次の操作があります。

public class PersonController {

    [HttpPut]
    public void UpdatePerson(PersonDTO person) {}

    [HttpPost]
    public void CreatePerson(PersonDTO person) {}

}

両方の操作に同じDTOを使用する方法はありますが、一方の操作にフィールド'id'を必須にするため、ModelStateは失敗しますか?チェックすることで手動で実行できることはわかっていますがperson.id == null、存在する場合は自動ソリューションを探しています。

4

1 に答える 1

1

これについてまだ助けが必要かどうかはわかりませんが、同様の回答を探していたので、あなたの質問に出くわしました. あなたが探しているものを達成するための簡単な方法を考え出しました。少しごまかしていますが、うまくいきます。

ページのマークアップで、問題のフィールドのスタイルに「data_val_required」を追加し、その後に必要なエラー メッセージを追加します。

例えば:

@Html.PasswordFor(model => model.OldPassword, 
                           new { data_val_required="The Old Password field is required." })

クライアント側のバリデーターはこれを拾い上げ、検証の概要に適切なメッセージを表示します。

サーバー側では、コードでモデルを検証し、フィールドの内容を手動で確認することを忘れないでください。これは、クライアント側の検証が機能することに依存できないためです (たとえば、JavaScript が無効になっている可能性があります)。

私がこれをしたかった理由は、パスワードの変更ページにあります。私のモデルには 3 つのフィールドが含まれています。

  1. 以前のパスワード
  2. 新しいパスワード[必須]
  3. パスワードの確認【必須】

古いパスワードは、ユーザーが自分のパスワードを変更することを自分で決定している場合にのみ必要です。ユーザーにパスワードのリセットを強制する場合 (ユーザーが古いパスワードを紛失したため)、古いパスワードは必要ありません (ユーザーが知らないため)。

したがって、ユーザーが自分の意志でパスワードを変更している場合は「data_val_required」を発行し、そうでない場合はフィールド全体を削除するコードがクライアント側にいくつかあります。

サーバー側にも両方のシナリオをチェックするためのコードがあります。

これがお役に立てば幸いです。

于 2012-12-19T02:16:36.813 に答える