Получить ожидаемый тип параметра действия в OnActionExecuting

Вопрос: возможно ли узнать тип параметра, который ожидается вызываемым действием? Например, у меня есть некоторые action как:

[TestCustomAttr]
public ActionResult TestAction(int a, string b)
{
    ...

а также TestCustomAttr определяется как:

public class TestCustomAttr : System.Web.Mvc.ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        ...

Поэтому, когда звонок сделан TestActionздесь, внутри OnActionExecutingя хочу знать тип, ожидаемый TestAction метод. (например: в этом случае есть 2 ожидаемых параметра. один имеет тип int а другой тип string,

Фактическая цель: На самом деле мне нужно внести изменения в значения QueryString, Я уже могу получить значения строки запроса (через HttpContext.Current.Request.QueryString), измените его, а затем вручную добавьте в ActionParameters как filterContext.ActionParameters[key] = updatedValue;

Проблема: в настоящее время я пытаюсь разобрать значение int, если он успешно проанализирован, я предполагаю, что это int, поэтому я делаю требуемое изменение (например, значение + 1), а затем добавляю его к параметрам действия, против его ключа.

 qsValue = HttpContext.Current.Request.QueryString[someKey].ToString();

 if(Int32.TryParse(qsValue, out intValue))
 {
     //here i assume, expected parameter is of type `int`
 }
 else
 {
     //here i assume, expected parameter is of type 'string'
 }

но я хочу знать точно ожидаемый тип. так как string может быть как "123"и предполагается, что int и добавлен как целочисленный параметр, вызывая нулевое исключение, для другого параметра. (наоборот). Поэтому я хочу проанализировать обновленное значение для точного ожидаемого типа, а затем добавить к параметрам действия, против его ключа. Итак, как я могу это сделать? Это вообще возможно? Может быть Reflection может помочь как-нибудь?

важно: я открыт для предложений. Если мой подход не подходит для достижения реальной цели, или если есть лучший способ сделать это, пожалуйста, поделитесь;)

1 ответ

Решение

Вы можете получить параметр из ActionDescriptor.

public class TestCustomAttr : System.Web.Mvc.ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var ActionInfo = filterContext.ActionDescriptor;
        var pars = ActionInfo.GetParameters();
        foreach (var p in pars)
        {

           var type = p.ParameterType; //get type expected
        }

    }
}
Другие вопросы по тегам