Я пытаюсь добавить новый ActionModel для ControllerModel в реализацию IControllerModelConvention, но я не могу найти никакой документации или примеров того, как эта модельная система работает или как это делать правильно. Я могу достаточно легко добавить новую модель ActionModel, но она не маршрутизируется после запуска приложения:
var action = new ActionModel(method, new object[] { new HttpGetAttribute("/test") })
{
Controller = controller,
ActionName = "test"
};
controller.Actions.Add(action);
Кажется, мне нужно добавить селектор к действию, возможно, и другие свойства, но я не смог найти тот, который предоставляет это действие. Также не уверен, верны ли мои атрибуты / избыточны. В конечном итоге я хотел бы добавить несколько действий, которые не сопоставляют 1: 1 с методами в контроллере.





Я сделал его похожим на ваш подход. Может быть, это поможет вам:
Контроллер
public class TestController : Controller
{
public IActionResult Index()
{
return Ok(new string[] { "Hello", "World" });
}
}
Типовое соглашение
public class TestControllerModelConvention : IControllerModelConvention
{
public void Apply(ControllerModel controller)
{
Type controllerType = typeof(TestController);
MethodInfo indexAction = controllerType.GetMethod("Index");
var testAction = new ActionModel(indexAction, new[] { new HttpGetAttribute("/test") })
{
ActionName = "Index",
Controller = controller
};
controller.Actions.Add(testAction);
}
}
Запускать
public void ConfigureServices(IServiceCollection services)
{
// other initialitation stuff
services.AddMvc(options =>
{
options.Conventions.Add(new TestControllerModelConvention());
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
Теперь, когда я запускаю приложение и просматриваю «/ test», оно попадает в действие контроллера.
Это не сработало для меня в тех случаях, когда метод действия не был допустимым действием контроллера (т.е. метод был частным или общим), в этих случаях мне также пришлось добавить селектор. Я предполагаю, что вы извлекаете выгоду из некоторого механизма в приложении по умолчанию, добавляя соответствующие селекторы если, метод был допустимым действием. Я предполагал, что с соглашением, которое включало их в качестве действий, часть маршрутизации «поверит нам на слово» и назначит маршруты из атрибутов, но это, похоже, не так.