2017-01-31 7 views
0

私は3種類のコンタクトフォームを持つウェブサイトを持っています。それぞれのコンタクトフォームはモデルに関連付けられています。コントローラの共有方法

  1. お問い合わせ
  2. 苦情

に参加彼らはすべての私のIContactインターフェース(EG、EnquiryAbstractContactAbstractContactIContactを実装を拡張)を実装低音クラス(AbstractContact)から継承します。

これは私のMake_A_Complaintビューで意味、私のモデルはJoin_Usビューのように、私のモデルはタイプModels.JoinのあるタイプModels.Complaint、である...

それはそれらすべてのためにいいだろう私のコントローラー内の1つの方法でルーティングします。何かのように

public ActionResult ContactUs(Models.Contact.IContact model) 

私はその後、希望のタイプにキャストすることができます。

しかし、MVCでは、インターフェイスとしてまたは抽象クラスをパラメータとして使用することはできません。

その他のオプションはありますか?コントローラで複数のメソッドを作成するための私の唯一の選択肢、私はので、私は

public ActionResult Send(Models.Contact.Enquiry model) 

public ActionResult Send(Models.Contact.Complaint model) 

public ActionResult Send(Models.Contact.Join model) 
+1

そのことはできません:

public abstract BaseContactController<T> where T : AbstractContract, IContact { public virtual ActionResult ContactUs(T model) { } } 

そして、1つのモデルタイプごとのコントローラ(Activate.CreateInstace()を使用してモデルのインスタンスを初期化し、インスタンスを作成する必要があります)。ただし、リクエスト内の値を読み込んでインスタンスを初期化するカスタムModelBinderを作成することもできます(ただし、それらを区別するプロパティが必要です) –

答えて

0

Asp.net MVCを持つことができないこれをオーバーロードすることが許可されてるとは思わないような

public ActionResult SendEnquiry(Models.Contact.Enquiry model) 

public ActionResult SendComplaint(Models.Contact.Complaint model) 

public ActionResult SendJoin(Models.Contact.Join model) 

ですデータを名前でモデルにマッピングします。すべてのモデルでは、新しいモデルに

public class ContactUsPostModel { 
    public string Email {get;set;} 
    public string Name {get;set;} 
    public string Model {get;set;} 
} 

を作成し、コントローラに

public ActionResult ContactUs(ContactUsPostModel model)

1

をこのモデルを使用できるフィールドの電子メール、名前、電話番号 を持っている場合、私はその使用を主張したいのは、例えばましょうあなたがにできるかどうかにかかわらず、モデルバインディングのインターフェースが悪い考えになるのはです。

モデルは、指定された3つのアクションのそれぞれで必要なプロパティのコアグループを共有しているため、これを実行したいと思われます。その場合、3つのモデルすべてをベースビューモデルから継承し、それをモデルバインディングオブジェクトとして使用しないでください。

メモとして、私は実際これを行うことをお勧めします。これらの3つのアクションのそれぞれは、明確な仕事を持ち、すべてを単一のメソッドに結びつけようとすると、単一の責任原則が破られます。彼らが多くのコードを共有している場合は、問題のコードを集中し、それぞれのメソッドから呼び出す。

+0

2番目の段落は機能しません - DefaultModelBinderはベースビューモデルのインスタンスのみを初期化します具体的なクラスではありません。 –

2

現在のコントローラーを継承し、それぞれのタイプごとに異なるコントローラーを使用できます。`DefaultModelBinder`を使用して、基本クラスで

public EnquiryController : BaseContactController<Models.Contact.Enquiry> 
{ 
    // actions are in the base class 
} 

public ComplaintController : BaseContactController<Models.Contact.Complaint> 
{ 
} 

public JoinController : BaseContactController<Models.Contact.Join> 
{ 
} 

だから、あなたが共有しているコードが、別のURLやモデル

/enquiry/contactus 
/complaint/contactus 
/join/contactus 
関連する問題