Получить ожидаемый тип параметра действия в 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
}
}
}