любой обходной путь, позволяющий результату действия принять класс Abstract в качестве параметра - PullRequest
0 голосов
/ 25 мая 2018

У меня разные конфигурации, все они наследуются от базовой конфигурации, которые настраиваются в формах.Я хочу, чтобы все они обрабатывались одним результатом действия.

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

Однако это невозможно, потому что вы не можете использовать абстрактные классы в качестве параметра для результата действия.Есть ли обходной путь для этого, поэтому мне не нужен отдельный результат действия для каждой конфигурации?(Я все еще хочу, чтобы каждая конфигурация была своим собственным классом, мне нужен только доступ к методам базового класса в логике результата действия).

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

По сути, вы не можете, и причина в том, что MVC попытается выполнить new AbstractBaseConfig() как часть процесса привязки данных (который анализирует URL-адрес или сообщение формы и помещает результаты в конкретный объект).И по определению, выполнение new AbstractBaseConfig() невозможно для абстрактного класса.

Это также имеет смысл по другим причинам, я объясню почему.

Вы, кажется, ожидаетечто MVC может определить класс из параметров, передаваемых в .Это не так, на самом деле все наоборот: метод действия должен указать точный класс , а затем Binder создаст экземпляр этого точного класса и попытается связать его свойства.

Предположим, у вас было это:

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 после привязки данных: aThing объект только с установленным ID?Или один из других типов объектов с установленным Name, но как MVC сможет узнать, какой класс вы имели в виду?

Так что по всем этим причинам это невозможно.

0 голосов
/ 25 мая 2018

У вас может быть базовый класс, наследующий абстрактный класс, и все ваши классы наследуются от этого базового класса, в то время как этот базовый класс является вашим параметром

Возьмем, к примеру,

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)
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...