基于继承的自定义模型绑定

时间:2012-11-07 20:01:41

标签: asp.net-mvc asp.net-mvc-4

我需要创建一个post动作来监听ASP.NET MVC 4中的大量事件消息。有很多事件因此我无法为每个事件创建一个动作。所以最好用他们的基类创建一个动作,因为发布的模型使用自定义模型绑定器来保护事件。

有些事件看起来像这样:

public class QueryID : Identity<Guid>
{
    public QueryID(Guid id)
    {
        Identifier = id;
    }
}

public class QueryEvent : IEvent<QueryID>
{
    public QueryEvent(QueryID id)
    {
        Identity = id;
    }

    #region Implementation of IEvent<out QueryID>

    public QueryID Identity { get; private set; }

    #endregion
}

public class QueryCreated : QueryEvent
{
    public string ConnectionID { get; private set; }

    public QueryCreated(QueryID id, string connectionID)
        : base(id)
    {
        ConnectionID = connectionID;
    }
}

public class ColumnAdded : QueryEvent
{
    public string Column { get; private set; }

    public ColumnAdded(QueryID id, string column)
        : base(id)
    {
        Column = column;
    }
}

接收这些消息的操作方法如下所示:

[HttpPost]
    public ActionResult Index(IEvent<IIdentity> e)
    {
        // whatever

        return new EmptyResult();
    }

基本Identity类实现IEvent<IIdentity>接口。

模型活页夹是什么样的?

由于

2 个答案:

答案 0 :(得分:1)

单纯的模型绑定对你没有帮助。模型绑定的工作方式是,框架查看操作所需的参数类型,使用反射创建该类型的默认实例,并使用表单中发送的数据对其上的每个公共属性进行水合。

您的操作中的参数是一个接口,因此框架无法创建实例。它只是不知道要创建的接口的哪个实现。

在一个实例中,我在发布的表单中使用了一个隐藏字段来指示接口的哪个实现绑定到action参数。但我有一个简单的场景。一个接口有两个实现。每一个对应一个表格。所以我可以有一个隐藏的文件告诉我我希望我的模型绑定器创建的类的名称。

在您的情况下,如果事件的发起者(我估计某个客户端应用程序)知道应该调用哪个模型,那么您可以将该信息与其他信息一起发送到您的操作。

不幸的是我目前没有代码。如果您认为此解决方案可能有所帮助,我可以挖出代码。

答案 1 :(得分:0)

可以编写自定义模型绑定程序提供程序以支持MVC3 +中的接口,请参阅此文章。

http://www.matthidinger.com/archive/2011/08/16/An-inheritance-aware-ModelBinderProvider-in-MVC-3.aspx

然后,任何继承特定接口的类型都会传递给相关的模型绑定器,然后可能会尝试as ConcreteClass和null检查以找出实际类型是什么。我没有尝试过这个因为我有一个类似的问题,并且无法解决问题,但相关的帖子看起来似乎指向了正确的方向。