Некоторые компиляторы дают лучшие сообщения, чем другие. Какой компилятор Вы используете? Однако они все довольно плохи. C++ 0X решит большую часть этой проблемы (см. понятия ), но стандарт не будет выпущен до 2009, и широкая поддержка, вероятно, будет еще позже, чем это:-(
Пока AuthorizeAttribute
наследуется, вы можете получить свой параметр из AuthorizationContext
следующим образом:
public class MyAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
string idParam = filterContext.Controller.ValueProvider.GetValue("id").AttemptedValue;
int id;
if (int.TryParse(idParam, out id))
{
if (id == 8) // apply your business logic here
return;
}
filterContext.Result = new HttpUnauthorizedResult();
}
}
[MyAuthorize]
public ActionResult Protected(int id)
{
return View();
}
ValueProvider
будет перебирать всех зарегистрированных провайдеров, которые по умолчанию включают в себя RouteDataValueProvider
, QueryStringValueProvider
и FormValueProvider
, и сделайте всю работу за вас.
В противном случае я рекомендую использовать ActionFilterAttribute
.
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var rd = httpContext.Request.RequestContext.RouteData;
string currentAction = rd.GetRequiredString("action");
string actionparam =Convert.ToString(rd.Values["param"]);
if (id == actionparam)
{
return base.AuthorizeCore(httpContext);
}
return true;
}