允许操作结果接受摘要 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?
所以由于所有这些原因,这是不可能的。
我有不同的配置,所有配置都继承自在表单中自定义的基本配置。我希望所有这些都由一个动作结果来处理。
[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?
所以由于所有这些原因,这是不可能的。