ASP.NET MVC - текущее действие из кода контроллера?
-
05-07-2019 - |
Вопрос
Это очень похоже на другой недавний вопрос:
Как вернуть текущее действие в представлении ASP.NET MVC? р>
Однако я хочу получить имя текущего действия из кода контроллера .
Итак, в коде функции, вызываемой действием, я хочу получить строку с именем текущего действия.
Возможно ли это?
Решение
Вы можете получить доступ к данным маршрута из вашего класса контроллера следующим образом:
var actionName = ControllerContext.RouteData.GetRequiredString (" action ");
Или, если " действие " не является обязательной частью вашего маршрута, вы можете просто внести данные в маршрут, как обычно.
Другие советы
Единственное, о чем я могу думать, это использовать StackFrame класс. Я не рекомендовал бы это, если вы имеете дело с критичным к производительности кодом, но вы могли бы использовать его. Единственная проблема заключается в том, что StackFrame предоставляет вам все методы, которые были вызваны до этого момента, но нет простого способа определить, какой из них является методом Action, но, возможно, в вашей ситуации вы знаете, сколько слоев будет в Action быть. Вот пример кода:
[HandleError]
public class HomeController : Controller
{
public void Index()
{
var x = ShowStackFrame();
Response.Write(x);
}
private string ShowStackFrame()
{
StringBuilder b = new StringBuilder();
StackTrace trace = new StackTrace(0);
foreach (var frame in trace.GetFrames())
{
var method = frame.GetMethod();
b.AppendLine(method.Name + "<br>");
foreach (var param in method.GetParameters())
{
b.AppendLine(param.Name + "<br>");
}
b.AppendLine("<hr>");
}
return b.ToString() ;
}
}
Ну, если вы находитесь в контроллере, вы знаете, какое действие вызывается. Я предполагаю, что у вас есть класс, который используется в контроллере, который должен вести себя по-разному в зависимости от вызываемого действия. Если это так, то я бы передал строковое представление действия в объект, который нуждается в этой информации из метода действия. Некоторый пример кода от вас действительно прояснит, что вам нужно сделать. Вот пример кода, о котором я думаю:
public ActionResult TestControllerAction()
{
var action = new TestControllerAction();
var objectWithBehaviorBasedOnAction = new MyObjectWithBehaviorBasedOnAction();
objectWithBehaviorBasedOnAction.DoSomething(action);
}
public class MyObjectWithBehaviorBasedOnAction: IMyBehaviorBasedOnAction
{
public void DoSomething(IControllerAction action)
{
// generic stuff
}
public void DoSomething(TestControllerAction action)
{
// do behavior A
}
public void DoSomething(OtherControllerAction action)
{
// do behavior b
}
}
public interface IMyBehaviorBasedOnAction
{
void DoSomething(IControllerAction action);
}