2012-01-30 9 views
0

私はAPIを構築しており、コントローラアクションにパラメータとして渡された入力オブジェクトを検証する必要があります。 同じ入力クラスは、異なるアクションに対して異なる強制プロパティを持つことがあります。mvc apiのコントローラ入力検証

ので

public class test 
{ 
public ActionResult Create(User user) 
{ 
    //here user_name must be present but no user_id 
} 
public ActionResult Delete(User user) 
{ 
    //here only user_id must be present. 
} 
} 

私はfluentValidation.netを見て持っていたが、1つが、クラスごとではないクラス/アクションのルールを作成する必要がありそうです。

ありがとうございました。

+4

「Delete」にIDだけを渡すのはなぜですか? – SLaks

+2

アクションを完了するために必要なプロパティのみを含むコントローラに対して、異なるビューモデルを使用できます。ありがとう。 – Brownman98

答えて

2

Userとは何ですか?

クラスがどこに定義されているのかという意味ではありませんが、ドメイン内では物理的にどういう意味ですか?あなたはそれが複数のものを意味するようにしようとしているように聞こえる。

これらのアクションをドメインのモデルに適合させるのではなく、アクションモデルを作成します。

class CreateUserAction 
{ 
    public string Username {get; set;} 
} 

class DeleteUserAction 
{ 
    public int ID {get; set;} 
} 

その後、あなたのアクションメソッドでこれらを使用します:このような何か

public ActionResult Create(CreateUserAction user) 
{ 
} 

public ActionResult Delete(DeleteUserAction user) 
{ 
} 

これは、単一責任の原則に基づいて、異なるクラスに異なる目的を抜け出すだろう。 時々ユーザーオブジェクトのIDのみを表す時々未作成したユーザーまたはを表すとは対照的に、今Userクラスは

一つの大きな利点ここなど、単純にユーザーオブジェクトを表すに集中することができますクラス内で検証規則を直接指定できるということです。この方法では、Userオブジェクトはと常に一致し、UsernameIDが有効である必要があります。 CreateUserActionオブジェクトにはID(それが必要ないため)もありませんが、DeleteUserActionオブジェクトにはUsername(不要なので)オブジェクトがありません。

必要に応じてさらにフィールドを追加することができます。たとえば、CreateUserActionオブジェクトには、作成されるユーザーを説明する他のフィールドが含まれている可能性があります。 (フィールドにはUserというオブジェクトはまったくないが、ドメイン内の他のオブジェクトに変換されることもあります)。しかし、DeleteUserActionは、ID以上のものを必要としません(SLAKsその行動方法についてはおそらくintと置き換えることができますが、それはあなた次第です)。

クラスの役割と責任が明確になり、部分的に初期化されたハーフオブジェクトが少なくなりました。

+0

ありがとう。私はこれらの行に沿って何かをやってしまった。継承と空の子クラスを用いる以外 れている私は置くすべての流暢なルール パブリッククラスユーザー { パブリック文字列名取得または設定;} } パブリッククラスMYUSER:ユーザー{} パブリッククラスMYUSERバリデータ:AbstractValidator { //規則 } でも基本型へのシリアル化の問題はありません。 – Jules