如何为不同类型的模型共享Controller

时间:2017-01-31 12:02:29

标签: asp.net-mvc

我有一个网站,有3种类型的联系表格,每个联系表格都与模型相关联。

  1. 询问
  2. 投诉
  3. 加入
  4. 它们都来自实现我的AbstractContact接口的低音类(IContact)(EG,Enquiry扩展AbstractContactAbstractContact实现{{1 }})。

    这意味着在我的Make_A_Complaint视图中,我的模型是Models.Complaint类型,其中在Join_Us视图中,我的模型是Models.Join ...

    对于他们所有人来说,通过我的Controller中的单个方法进行路由会很不错。像

    这样的东西
    IContact

    然后我可以将其转换为所需的类型。

    但是,MVC似乎不允许我使用接口或抽象类作为参数。

    还有其他选择吗?是我在控制器中创建多个方法的唯一选择,例如

    public ActionResult ContactUs(Models.Contact.IContact model)
    

    我不相信我可以超载这个,所以我不能

    public ActionResult SendEnquiry(Models.Contact.Enquiry model)
    
    public ActionResult SendComplaint(Models.Contact.Complaint model)  
    
    public ActionResult SendJoin(Models.Contact.Join model)
    

3 个答案:

答案 0 :(得分:2)

您可以为每种类型设置不同的控制器,继承自当前的控制器。

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

然后每个型号类型一个控制器:

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

答案 1 :(得分:1)

我认为无论你是否能够这样做,在模型绑定中使用接口都是一个坏主意。

您可能希望这样做,因为模型共享一组核心属性,这三个属性是三个指定操作中的每一个所必需的。如果是这种情况,为什么不从基本视图模型继承所有三个模型并将其用作模型绑定对象?

作为旁注,我实际上建议不要这样做。这三个行动中的每一个都有不同的工作,并试图将它们全部绑定到一个方法中,这违反了单一责任原则。如果他们共享大量代码,请集中讨论相关代码并从每个方法中调用它。

答案 2 :(得分:0)

Asp.net mvc将数据映射到模型名称。例如,假设所有模型都包含电子邮件,姓名,电话等字段 您可以创建新模型

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

在控制器中使用此模型

public ActionResult ContactUs(ContactUsPostModel model)