允许操作结果接受摘要 class 作为参数的任何解决方法

any work around to allow for an action result to accept a Abstract class as parameter

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

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

但是,这是不可能的,因为您不能将抽象 classes 作为操作结果的参数。是否有解决此问题的方法,因此我不需要为每个配置单独的操作结果? (我仍然希望每个配置都是它自己的 class,我只需要访问操作结果逻辑中的基本 class 方法)。

你可以让一个基础 class 继承抽象 class 并且你所有的 class 继承自那个基础 class 同时拥有那个基础 class作为你的参数

举个例子

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 将尝试做 new AbstractBaseConfig() 作为数据绑定过程的一部分(它解析 URL 或表单 Post并将结果放入具体对象中)。根据定义,new AbstractBaseConfig() 对于抽象 class.

是不可能的

还有其他原因,我会解释为什么。

您似乎期望 MVC 可以根据传入的参数 确定class。这不是它的工作方式,事实上恰恰相反:Action Method 必须指定 exact class,然后 Binder 将实例化那个 class ] 并尝试绑定其属性。

假设你有这个:

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 中包含什么:只有 [=16 的 Thing 对象=]设置?或者设置了 Name 的其他对象类型之一,但是 MVC 怎么会知道你指的是哪个 class?

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