0

我需要创建一个发布操作来监听 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>接口。

模型绑定器会是什么样子来完成这个?

谢谢

4

2 回答 2

1

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

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

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

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

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

于 2012-11-07T21:26:17.620 回答
0

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

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

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

于 2013-01-24T02:29:54.673 回答