如何在aspx.cs页面上使用MVC自定义属性?

时间:2015-03-04 11:37:08

标签: c# asp.net asp.net-mvc

我的应用程序在Asp.net MVC 4.我使用.aspx页面打开报告。我已在所有应用操作上实现了自定义用户权限属性。我想在我的.aspx.cs页面类或.aspx.cs页面中的每个函数上使用它。如何使用它?我可以在aspx页面中使用MVC自定义属性吗? 在mvc我用这样的

[AuthorizeUserControls("urlInventoryReport")]   
public ActionResult Inventory(string ReportTitle)    
{

}

如何在.aspx.cs页面中使用

public partial class ReportViewer : System.Web.UI.Page

{

[AuthorizeUserControls("urlInventoryReport")] //it's not working

private void ViewInventoryReport()

{

}

}

1 个答案:

答案 0 :(得分:3)

属性是 static 对象,它们将元数据应用于.NET中的类型。它们不包含行为

您的属性在ASP.NET MVC中工作的原因是因为MVC具有过滤器,该过滤器在执行对action方法的调用之前和之后运行。此过滤器由MVC框架调用,而MVC框架又由路由处理程序(专用的HTTP处理程序)调用。

行为与属性在同一个类中定义(产生ActionFilterAttribute)这一事实只是为了方便起见。您也可以像在this answer中一样将属性与动作过滤器分开。

按照MVC方法制作IActionFilter函数,将为您的页面使用.NET路由并制作一个专门的IRouteHandler,可以在使用Reflection确定实例化页面对象后对其进行扫描如果该属性存在,则执行关联的IActionFilter中的行为。我建议你走这条路,分析MVC source code并提取你需要的东西,但这不适合胆小的人。

或者,您可以将扫描实现放入Page_Init事件中,但此时您最好不要因为静态声明属性而只是在本地执行该行为而烦恼。

假设您的属性来自ActionFilterAttribute,您可以执行以下操作:

protected void Page_Init(object sender, EventArgs e)
{
    var attribute = new AuthorizeUserControls("urlInventoryReport");
    var filterContext = CreateFakeActionExecutingContext(); // TODO: Implement this.
    attribute.OnActionExecuting(filterContext);
}