2014-12-08 3 views
2

Если у меня есть это действие:Косвенно объявить параметр в действии ASP.NET MVC

public ActionResult MyAction(long? personId) 
    { 
     // ... 
    } 

я могу назвать это действие с этим URL:

localhost/MyAction/?personId=x 

Я хочу, чтобы иметь возможность отправить еще один дополнительный параметр (token), который будет во всем моем AJAX звонки от клиента:

localhost/MyAction/?personId=x&token=asdf 

Без объявления этого нового параметра во всех моих сигнатурах действия. Что это: Я хочу, чтобы избежать этого:

public ActionResult MyAction(long? personId, string token) 
    { 
     // ... 
    } 

    public ActionResult MyAction2(long? animalId, string token) 
    { 
     // ... 
    } 

    etc. 

Но я также хочу, чтобы иметь возможность иметь доступ к параметру token внутри метода. То есть:

public ActionResult MyAction(long? personId) 
    { 
     // I can check the token's value or manipulate it, eg: 
     if (token.Equals(...)) { .. } 
    } 

Вопрос:

Есть ли способ, чтобы объявить этот параметр неявно во всех (или некоторых) моих действий? Может быть, используя атрибуты?

ответ

2

Вы можете вывести все контроллеры из общего базового контроллера. Затем переопределите OnActionExecuting в этом и получите доступ к Querystring. Например:

public class BaseController : Controller 
{ 
    protected string Token { get; private set; } 

    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     base.OnActionExecuting(filterContext); 

     string token = Request.QueryString["token"] as string; 
     Token = token ?? string.Empty; 
    } 
} 

Я нахожу это более чистым решением, чем статический класс. Кроме того, BaseController - это полезный шаблон в MVC для совместного использования кода, который используется во многих контроллерах.

1
public class Token 
{ 
    public static string Value 
    { 
    get 
    { 
     return System.Web.HttpContext.Current.Request["token"]; 
    } 
    } 
} 

public ActionResult MyAction(long? personId) 
{ 
    // I can check the token's value or manipulate it, eg: 
    if (Token.Value.Equals(...)) { .. } 
} 

Не забудьте учесть Token.Value быть null.

Смежные вопросы