Asp.net 允许操作结果接受抽象类作为参数的任何变通方法

Asp.net 允许操作结果接受抽象类作为参数的任何变通方法,asp.net,asp.net-mvc,asp.net-mvc-4,asp.net-core,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Asp.net Core,我有不同的配置,所有配置都继承自表单中自定义的基本配置。我希望所有这些都由单个操作结果处理 [HttpPost] public IActionResult Register(AbstractBaseConfig config) { ...do some logic... return View("../Home/Index"); } 但是,这是不可能的,因为您不能将抽象类作为操作结果的参数进行基处理。是否有任何解决方法,这样我就不

我有不同的配置,所有配置都继承自表单中自定义的基本配置。我希望所有这些都由单个操作结果处理

    [HttpPost]
    public IActionResult Register(AbstractBaseConfig config)
    {
        ...do some logic...
        return View("../Home/Index");
    }

但是,这是不可能的,因为您不能将抽象类作为操作结果的参数进行基处理。是否有任何解决方法,这样我就不需要为每个配置提供单独的操作结果?我仍然希望每个配置都是它自己的类,我只需要访问操作结果逻辑中的基类方法。

您可以让一个基类继承抽象类,并且所有类都从该基类继承,同时将该基类作为参数

例如

public abstract class ABase
{
  public void stuff()
  {
      var stuff = string.Empty;
      stuff = "hello";
  }

  public virtual void otherstuff()
  {
      var stuff = string.Empty;
      stuff = "hello";
  }
}

public class Base : ABase
{
  //empty
}

public class Derived : Base
{
  public void mystuff()
  {
    this.stuff();
  }

  public override void otherstuff()
  {
     // Custom code
  }
}

public ActionResult Register(Base config)
{
}

基本上你不能,原因是MVC将尝试做新的AbstractBaseConfig作为数据绑定过程的一部分,该过程解析URL或表单Post,并将结果放入一个具体的对象中。根据定义,对于抽象类来说,执行新的AbstractBaseConfig是不可能的

还有其他原因,我会解释原因

您似乎期望MVC可以根据传入的参数确定类。这不是它的工作方式,事实恰恰相反:Action方法必须指定确切的类,然后绑定器将实例化该确切的类并尝试绑定其属性

假设你有这个:

public abstract class Thing { public int ID { get;set; } }
public class NamedThing : Thing { public string Name { get;set; } }
public class OtherThing : Thing { public string Name { get;set; } }
假设允许它使用:

public IActionResult Register(Thing thing)
那么在数据绑定之后,您希望在thing中包含什么:一个只设置了ID的thing对象?或者其他一种对象类型,名称已设置,但是MVC怎么知道您指的是哪个类呢


因此,由于所有这些原因,这是不可能的。

Hmm,我看到的唯一问题是,我需要重写每个派生类中在Base中定义的函数。如果所有派生类都对Base方法执行相同的操作,则不必重写它们,除非它们在Base类中都有不同的方法实现。它们都有不同的实现。我在Base中有一个函数BuildString。然后,在每个派生类中,它仅在每个特定的派生类中根据属性的不同来实现这一点。然后,唯一的方法是重写它们,这是有意义的。在抽象类中使方法虚拟,并在派生类中重写它,就像在具有自定义实现的类中一样,还可以参见下面关于为什么它不能是参数的答案好的,谢谢。我认为这是不可能的,但我只是想确保我没有忽略任何东西,然后我为每个CONF.FIY实现了不同的行动结果。是的,如果您创建一个定制的ModelBinder,那么这是可能的——请求只需要包含一些标识要初始化哪个具体实现的内容。请参阅了解模型绑定过程,其中包括抽象ModelBinder的一些代码